From 4a68e1032db4630db24cd0858b6cab0118ca9e0a Mon Sep 17 00:00:00 2001 From: Sung-jae Park Date: Mon, 9 Nov 2015 16:58:22 +0900 Subject: [PATCH] Clean up 2.x implementations. All APIs are re-implemented using pepper-EFL and new AppFW API set Change-Id: Id1b847e8ce908b846b1508d23282e716e78830c9 --- CMakeLists.txt | 2 - ...wer.manifest => libwidget_viewer_evas.manifest} | 0 ...dget_viewer.spec => libwidget_viewer_evas.spec} | 72 +- widget_viewer/CMakeLists.txt | 103 - widget_viewer/LICENSE | 206 - widget_viewer/include/client.h | 24 - widget_viewer/include/conf.h | 48 - widget_viewer/include/debug.h | 28 - widget_viewer/include/desc_parser.h | 19 - widget_viewer/include/dlist.h | 43 - widget_viewer/include/fb.h | 35 - widget_viewer/include/file_service.h | 21 - widget_viewer/include/master_rpc.h | 24 - widget_viewer/include/util.h | 30 - widget_viewer/include/widget_viewer.h | 1647 ---- widget_viewer/include/widget_viewer_internal.h | 278 - widget_viewer/src/client.c | 2360 ------ widget_viewer/src/conf.c | 82 - widget_viewer/src/desc_parser.c | 701 -- widget_viewer/src/dlist.c | 189 - widget_viewer/src/fb.c | 682 -- widget_viewer/src/fb_wayland.c | 639 -- widget_viewer/src/file_service.c | 715 -- widget_viewer/src/master_rpc.c | 319 - widget_viewer/src/util.c | 137 - widget_viewer/src/widget.c | 4233 ---------- widget_viewer/src/widget_internal.c | 1061 --- widget_viewer/widget_viewer.pc.in | 12 - widget_viewer_evas/CMakeLists.txt | 18 +- widget_viewer_evas/include/util.h | 29 - .../include/widget_viewer_evas_internal.h | 279 - widget_viewer_evas/src/util_wayland.c | 35 - widget_viewer_evas/src/util_x11.c | 107 - widget_viewer_evas/src/widget_viewer_evas.c | 8222 +------------------- widget_viewer_evas/widget_viewer_evas.pc.in | 2 +- 35 files changed, 59 insertions(+), 22343 deletions(-) rename packaging/{libwidget_viewer.manifest => libwidget_viewer_evas.manifest} (100%) rename packaging/{libwidget_viewer.spec => libwidget_viewer_evas.spec} (60%) delete mode 100644 widget_viewer/CMakeLists.txt delete mode 100644 widget_viewer/LICENSE delete mode 100644 widget_viewer/include/client.h delete mode 100644 widget_viewer/include/conf.h delete mode 100644 widget_viewer/include/debug.h delete mode 100644 widget_viewer/include/desc_parser.h delete mode 100644 widget_viewer/include/dlist.h delete mode 100644 widget_viewer/include/fb.h delete mode 100644 widget_viewer/include/file_service.h delete mode 100644 widget_viewer/include/master_rpc.h delete mode 100644 widget_viewer/include/util.h delete mode 100644 widget_viewer/include/widget_viewer.h delete mode 100644 widget_viewer/include/widget_viewer_internal.h delete mode 100644 widget_viewer/src/client.c delete mode 100644 widget_viewer/src/conf.c delete mode 100644 widget_viewer/src/desc_parser.c delete mode 100644 widget_viewer/src/dlist.c delete mode 100644 widget_viewer/src/fb.c delete mode 100644 widget_viewer/src/fb_wayland.c delete mode 100644 widget_viewer/src/file_service.c delete mode 100644 widget_viewer/src/master_rpc.c delete mode 100644 widget_viewer/src/util.c delete mode 100644 widget_viewer/src/widget.c delete mode 100644 widget_viewer/src/widget_internal.c delete mode 100644 widget_viewer/widget_viewer.pc.in delete mode 100644 widget_viewer_evas/include/util.h delete mode 100644 widget_viewer_evas/include/widget_viewer_evas_internal.h delete mode 100644 widget_viewer_evas/src/util_wayland.c delete mode 100644 widget_viewer_evas/src/util_x11.c diff --git a/CMakeLists.txt b/CMakeLists.txt index b289f6d..c8605f2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,8 +1,6 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.6) -ADD_SUBDIRECTORY(widget_viewer) ADD_SUBDIRECTORY(widget_viewer_evas) ADD_SUBDIRECTORY(widget_viewer_sdk) -ADD_DEPENDENCIES(widget_viewer_evas widget_viewer) ADD_DEPENDENCIES(widget_viewer_sdk widget_viewer_evas) diff --git a/packaging/libwidget_viewer.manifest b/packaging/libwidget_viewer_evas.manifest similarity index 100% rename from packaging/libwidget_viewer.manifest rename to packaging/libwidget_viewer_evas.manifest diff --git a/packaging/libwidget_viewer.spec b/packaging/libwidget_viewer_evas.spec similarity index 60% rename from packaging/libwidget_viewer.spec rename to packaging/libwidget_viewer_evas.spec index fb1358c..54a8576 100644 --- a/packaging/libwidget_viewer.spec +++ b/packaging/libwidget_viewer_evas.spec @@ -1,8 +1,8 @@ %bcond_with wayland -Name: libwidget_viewer -Summary: Library for developing the application -Version: 1.2.2 +Name: libwidget_viewer_evas +Summary: Library for developing the widget viewer evas +Version: 2.0.0 Release: 1 Group: Applications/Core Applications License: Flora-1.1 @@ -25,25 +25,19 @@ BuildRequires: pkgconfig(capi-appfw-application) BuildRequires: pkgconfig(appcore-efl) BuildRequires: pkgconfig(capi-system-info) BuildRequires: pkgconfig(efl-extension) - -%if %{with wayland} BuildRequires: pkgconfig(wayland-client) BuildRequires: pkgconfig(libtbm) -%else -BuildRequires: pkgconfig(x11) -BuildRequires: pkgconfig(xext) -%endif %description -API for creating a new instance of the widget and managing its life-cycle. +Provider APIs to develop the widget viewer EFL application. %package devel -Summary: Development Library for widget Viewer Application (dev) +Summary: Widget provider application development library (dev) (EFL version) Group: Development/Libraries Requires: %{name} = %{version}-%{release} %description devel -Header and package configuration files for the widget viewer development +Header & package configuration files to support development of the widget viewer applications. (for EFL app) %prep %setup -q @@ -51,23 +45,8 @@ cp %{SOURCE1001} . cp %{SOURCE1002} . %build -export CFLAGS="$CFLAGS -DTIZEN_DEBUG_ENABLE" -export CXXFLAGS="$CXXFLAGS -DTIZEN_DEBUG_ENABLE" -export FFLAGS="$FFLAGS -DTIZEN_DEBUG_ENABLE" - -export CFLAGS="${CFLAGS} -DTIZEN_ENGINEER_MODE" -export CXXFLAGS="${CXXFLAGS} -DTIZEN_ENGINEER_MODE" -export FFLAGS="${FFLAGS} -DTIZEN_ENGINEER_MODE" - -%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} -DWIDGET_ENABLED=On + +%cmake . -DWIDGET_ENABLED=On make %{?jobs:-j%jobs} %install @@ -90,27 +69,6 @@ rm -rf %{buildroot} %{_libdir}/pkgconfig/widget_viewer.pc ################################################# -# libwidget_viewer_evas -%package -n %{name}_evas -Summary: Library for developing the widget viewer evas -Group: Applications/Core Applications -License: Flora-1.1 - -%description -n %{name}_evas -Provider APIs to develop the widget viewer EFL application. - -%package -n %{name}_evas-devel -Summary: Widget provider application development library (dev) (EFL version) -Group: Development/Libraries -Requires: %{name}_evas - -%description -n %{name}_evas-devel -Header & package configuration files to support development of the widget viewer applications. (for EFL app) - -%post -n %{name}_evas -p /sbin/ldconfig -%postun -n %{name}_evas -p /sbin/ldconfig - -################################################# # org.tizen.widget_viewer_sdk %package -n org.tizen.widget_viewer_sdk Summary: The widget viewer for development using SDK(IDE) @@ -125,20 +83,6 @@ While developing the widget applications, this viewer will load it and execute i %post -n org.tizen.widget_viewer_sdk -p /sbin/ldconfig %postun -n org.tizen.widget_viewer_sdk -p /sbin/ldconfig -%files -n %{name}_evas -%manifest %{name}.manifest -%defattr(-,root,root,-) -%{_libdir}/%{name}_evas.so* -%{_datadir}/widget_viewer_evas/* -%{_datarootdir}/license/%{name}_evas - -%files -n %{name}_evas-devel -%manifest %{name}.manifest -%defattr(-,root,root,-) -%{_includedir}/widget_viewer_evas/widget_viewer_evas.h -%{_includedir}/widget_viewer_evas/widget_viewer_evas_internal.h -%{_libdir}/pkgconfig/widget_viewer_evas.pc - %files -n org.tizen.widget_viewer_sdk %manifest org.tizen.widget_viewer_sdk.manifest %defattr(-,root,root,-) diff --git a/widget_viewer/CMakeLists.txt b/widget_viewer/CMakeLists.txt deleted file mode 100644 index 1cda0b1..0000000 --- a/widget_viewer/CMakeLists.txt +++ /dev/null @@ -1,103 +0,0 @@ -CMAKE_MINIMUM_REQUIRED(VERSION 2.6) -PROJECT(widget_viewer C) - -SET(PREFIX ${CMAKE_INSTALL_PREFIX}) -SET(EXEC_PREFIX "\${prefix}") -SET(PROJECT_NAME "${PROJECT_NAME}") -SET(LIBDIR ${LIB_INSTALL_DIR}) -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 - aul - glib-2.0 - gio-2.0 - com-core - sqlite3 - db-util - widget_service - vconf -) - -SET(BUILD_SOURCE - src/client.c - src/conf.c - src/desc_parser.c - src/dlist.c - src/widget.c - src/widget_internal.c - src/file_service.c - src/master_rpc.c - src/util.c -) - -IF (X11_SUPPORT) -pkg_check_modules(pkgs_extra REQUIRED - x11 - xext -) - -SET(BUILD_SOURCE - ${BUILD_SOURCE} - src/fb.c -) -ADD_DEFINITIONS("-DHAVE_X11") -ENDIF (X11_SUPPORT) - -IF (WAYLAND_SUPPORT) -pkg_check_modules(pkgs_extra REQUIRED - libtbm -) - -SET(BUILD_SOURCE - ${BUILD_SOURCE} - src/fb_wayland.c -) -ADD_DEFINITIONS("-DHAVE_WAYLAND") -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 -Wall -Werror -Winline -g") - -SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}") - -ADD_DEFINITIONS("-DPREFIX=\"${PREFIX}\"") -ADD_DEFINITIONS("-DLOG_TAG=\"WIDGET_VIEWER\"") -ADD_DEFINITIONS("-DNDEBUG") -ADD_DEFINITIONS("-D_USE_ECORE_TIME_GET") -#ADD_DEFINITIONS("-DFLOG") -ADD_DEFINITIONS("-DMASTER_PKGNAME=\"data-provider-master\"") -ADD_DEFINITIONS("-DINFO_SOCKET=\"/opt/usr/share/live_magazine/.live.socket\"") -ADD_DEFINITIONS("-DCLIENT_SOCKET=\"/tmp/.data-provider-master-client.socket\"") -ADD_DEFINITIONS("-DSLAVE_SOCKET=\"/tmp/.data-provider-master-slave.socket\"") -ADD_DEFINITIONS("-DSHARED_SOCKET=\"/tmp/.data-provider-master-fd.socket\"") -ADD_DEFINITIONS("-DSERVICE_SOCKET=\"/tmp/.data-provider-master-service.socket\"") -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_DIR}) -INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc DESTINATION ${LIB_INSTALL_DIR}/pkgconfig) - -INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/widget_viewer.h DESTINATION include/${PROJECT_NAME}) - -INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE DESTINATION /usr/share/license RENAME "lib${PROJECT_NAME}") diff --git a/widget_viewer/LICENSE b/widget_viewer/LICENSE deleted file mode 100644 index 571fe79..0000000 --- a/widget_viewer/LICENSE +++ /dev/null @@ -1,206 +0,0 @@ -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/widget_viewer/include/client.h b/widget_viewer/include/client.h deleted file mode 100644 index dc7a744..0000000 --- a/widget_viewer/include/client.h +++ /dev/null @@ -1,24 +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. - */ - -extern int client_init(int use_thread); -extern int client_fd(void); -extern const char *client_addr(void); -extern const char *client_direct_addr(void); -extern int client_direct_fd(void); -extern int client_fini(void); - -/* End of a file */ diff --git a/widget_viewer/include/conf.h b/widget_viewer/include/conf.h deleted file mode 100644 index 1e96f47..0000000 --- a/widget_viewer/include/conf.h +++ /dev/null @@ -1,48 +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. - */ - -/*! - * \note - * milli seconds - */ -#define MAX_LOG_FILE 3 -#define MAX_LOG_LINE 1000 -#define SLAVE_LOG_PATH "/tmp/.widget.service/log/" - -#if !defined(VCONFKEY_MASTER_STARTED) -#define VCONFKEY_MASTER_STARTED "memory/data-provider-master/started" -#endif - -#if !defined(VCONFKEY_MASTER_CLIENT_ADDR) -#define VCONFKEY_MASTER_CLIENT_ADDR "db/data-provider-master/serveraddr" -#endif - -extern void conf_set_manual_sync(int flag); -extern int conf_manual_sync(void); -extern void conf_set_frame_drop_for_resizing(int flag); -extern int conf_frame_drop_for_resizing(void); -extern void conf_set_shared_content(int flag); -extern int conf_shared_content(void); -extern double conf_event_filter(void); -extern void conf_set_event_filter(double filter); -extern void conf_set_direct_update(int flag); -extern int conf_direct_update(void); -extern int conf_extra_buffer_count(void); -extern void conf_set_extra_buffer_count(int buffer_count); -extern widget_status_e conf_last_status(void); -extern void conf_set_last_status(widget_status_e status); - -/* End of a file */ diff --git a/widget_viewer/include/debug.h b/widget_viewer/include/debug.h deleted file mode 100644 index 483309e..0000000 --- a/widget_viewer/include/debug.h +++ /dev/null @@ -1,28 +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. - */ - -#if !defined(FLOG) -#define DbgPrint(format, arg...) SECURE_LOGD(format, ##arg) -#define ErrPrint(format, arg...) SECURE_LOGE(format, ##arg) -#else -extern FILE *__file_log_fp; -#define DbgPrint(format, arg...) do { fprintf(__file_log_fp, "[LOG] [%s/%s:%d] " format, widget_util_basename(__FILE__), __func__, __LINE__, ##arg); fflush(__file_log_fp); } while (0) - -#define ErrPrint(format, arg...) do { fprintf(__file_log_fp, "[ERR] [%s/%s:%d] " format, widget_util_basename(__FILE__), __func__, __LINE__, ##arg); fflush(__file_log_fp); } while (0) -#endif - - -/* End of a file */ diff --git a/widget_viewer/include/desc_parser.h b/widget_viewer/include/desc_parser.h deleted file mode 100644 index 72c3dda..0000000 --- a/widget_viewer/include/desc_parser.h +++ /dev/null @@ -1,19 +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. - */ - -extern int parse_desc(struct widget_common *common, const char *filename, int is_pd); - -/* End of a file */ diff --git a/widget_viewer/include/dlist.h b/widget_viewer/include/dlist.h deleted file mode 100644 index 3f19827..0000000 --- a/widget_viewer/include/dlist.h +++ /dev/null @@ -1,43 +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. - */ - -#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); (l) && ((data) = dlist_data(l)); (l) = dlist_next(l)) - -#define dlist_foreach_safe(list, l, n, data) \ - for ((l) = (list), (n) = dlist_next(l); \ - (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/widget_viewer/include/fb.h b/widget_viewer/include/fb.h deleted file mode 100644 index e7b8543..0000000 --- a/widget_viewer/include/fb.h +++ /dev/null @@ -1,35 +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. - */ - -struct fb_info; - -extern int fb_init(void *disp); -extern int fb_fini(void); -extern const char *fb_id(struct fb_info *info); -extern int fb_get_size(struct fb_info *info, int *w, int *h); -extern int fb_sync(struct fb_info *info, int x, int y, int w, int h); -extern int fb_size(struct fb_info *info); -extern int fb_refcnt(void *data); -extern int fb_is_created(struct fb_info *info); -extern int fb_type(struct fb_info *info); - -extern struct fb_info *fb_create(const char *filename, int w, int h); -extern int fb_destroy(struct fb_info *info); - -extern void *fb_acquire_buffer(struct fb_info *info); -extern int fb_release_buffer(void *data); - -/* End of a file */ diff --git a/widget_viewer/include/file_service.h b/widget_viewer/include/file_service.h deleted file mode 100644 index 9212d03..0000000 --- a/widget_viewer/include/file_service.h +++ /dev/null @@ -1,21 +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. - */ - -extern int file_service_send_request(const char *filename, const char *save_to, void (*result_cb)(const char *filename, const char *save_to, int ret, void *data), void *data); -extern int file_service_fini(void); -extern int file_service_init(void); - -/* End of a file */ diff --git a/widget_viewer/include/master_rpc.h b/widget_viewer/include/master_rpc.h deleted file mode 100644 index e07306d..0000000 --- a/widget_viewer/include/master_rpc.h +++ /dev/null @@ -1,24 +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. - */ - -extern int master_rpc_async_request(struct widget *handler, struct packet *packet, int urgent, void (*ret_cb)(struct widget *handler, const struct packet *result, void *data), void *data); -extern int master_rpc_sync_request(struct packet *packet); -extern void master_rpc_check_and_fire_consumer(void); -extern int master_rpc_request_only(struct widget *handler, struct packet *packet); -extern int master_rpc_clear_fault_package(const char *pkgname); -extern int master_rpc_clear_all_request(void); - -/* End of a file */ diff --git a/widget_viewer/include/util.h b/widget_viewer/include/util.h deleted file mode 100644 index b463568..0000000 --- a/widget_viewer/include/util.h +++ /dev/null @@ -1,30 +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. - */ - -extern int util_check_extension(const char *filename, const char *check_ptr); -extern double util_timestamp(void); -extern const char *util_uri_to_path(const char *uri); -extern int util_unlink(const char *filename); - -#define SCHEMA_FILE "file://" -#define SCHEMA_PIXMAP "pixmap://" -#define SCHEMA_SHM "shm://" - -#define container_of(ptr, type, member) \ - ({ const typeof( ((type *)0)->member ) *__mptr = (ptr); \ - (type *)( (char *)__mptr - offsetof(type,member) );}) - -/* End of a file */ diff --git a/widget_viewer/include/widget_viewer.h b/widget_viewer/include/widget_viewer.h deleted file mode 100644 index be29dcd..0000000 --- a/widget_viewer/include/widget_viewer.h +++ /dev/null @@ -1,1647 +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 - -#ifndef __WIDGET_VIEWER_H -#define __WIDGET_VIEWER_H - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @file widget_viewer.h - * @brief This file declares API of libwidget-viewer library - * @since_tizen 2.3.1 - */ - -/** - * @addtogroup CAPI_WIDGET_VIEWER_MODULE - * @{ - */ - -/** - * @brief Structure definition for a widget instance. - * @since_tizen 2.3.1 - */ -typedef struct widget *widget_h; - -/** - * @internal - * @brief Definition for a default update period for widget (defined in the package manifest file). - * @since_tizen 2.3.1 - */ -#define WIDGET_DEFAULT_PERIOD -1.0f - -#define WIDGET_VIEWER_CLICK_BUTTON_LEFT "clicked" -#define WIDGET_VIEWER_CLICK_BUTTON_RIGHT "clicked,1" -#define WIDGET_VIEWER_CLICK_BUTTON_CENTER "clicked,2" - -/** - * @internal - * @brief Enumeration for Mouse & Key event for buffer type widget or Glance Bar. - * @details Viewer should send these events to widget. - * @since_tizen 2.3.1 - */ -typedef enum widget_mouse_event_type { - WIDGET_MOUSE_EVENT_MASK = 0x20000000, /**< Mask value for mouse event */ - WIDGET_MOUSE_EVENT_GBAR_MASK = 0x10000000, /**< Mask value for Glance Bar event */ - WIDGET_MOUSE_EVENT_WIDGET_MASK = 0x40000000, /**< Mask value for widget event */ - - WIDGET_MOUSE_EVENT_DOWN = 0x00000001, /**< widget mouse down event for widget */ - WIDGET_MOUSE_EVENT_UP = 0x00000002, /**< widget mouse up event for widget */ - WIDGET_MOUSE_EVENT_MOVE = 0x00000004, /**< widget mouse move event for widget */ - WIDGET_MOUSE_EVENT_ENTER = 0x00000008, /**< widget mouse enter event for widget */ - WIDGET_MOUSE_EVENT_LEAVE = 0x00000010, /**< widget mouse leave event for widget */ - WIDGET_MOUSE_EVENT_SET = 0x00000020, /**< widget mouse set auto event for widget */ - WIDGET_MOUSE_EVENT_UNSET = 0x00000040, /**< widget mouse unset auto event for widget */ - - WIDGET_MOUSE_EVENT_ON_SCROLL = 0x00000080, /**< widget On scrolling */ - WIDGET_MOUSE_EVENT_ON_HOLD = 0x00000100, /**< widget On holding */ - WIDGET_MOUSE_EVENT_OFF_SCROLL = 0x00000200, /**< widget Stop scrolling */ - WIDGET_MOUSE_EVENT_OFF_HOLD = 0x00000400, /**< widget Stop holding */ - - WIDGET_MOUSE_ON_SCROLL = WIDGET_MOUSE_EVENT_WIDGET_MASK | WIDGET_MOUSE_EVENT_MASK | WIDGET_MOUSE_EVENT_ON_SCROLL, /**< Mouse event occurs while scrolling */ - WIDGET_MOUSE_ON_HOLD = WIDGET_MOUSE_EVENT_WIDGET_MASK | WIDGET_MOUSE_EVENT_MASK | WIDGET_MOUSE_EVENT_ON_HOLD, /**< Mouse event occurs on holding */ - WIDGET_MOUSE_OFF_SCROLL = WIDGET_MOUSE_EVENT_WIDGET_MASK | WIDGET_MOUSE_EVENT_MASK | WIDGET_MOUSE_EVENT_OFF_SCROLL, /**< Scrolling stopped */ - WIDGET_MOUSE_OFF_HOLD = WIDGET_MOUSE_EVENT_WIDGET_MASK | WIDGET_MOUSE_EVENT_MASK | WIDGET_MOUSE_EVENT_OFF_HOLD, /**< Holding stopped */ - - WIDGET_MOUSE_DOWN = WIDGET_MOUSE_EVENT_WIDGET_MASK | WIDGET_MOUSE_EVENT_MASK | WIDGET_MOUSE_EVENT_DOWN, /**< Mouse down on the widget */ - WIDGET_MOUSE_UP = WIDGET_MOUSE_EVENT_WIDGET_MASK | WIDGET_MOUSE_EVENT_MASK | WIDGET_MOUSE_EVENT_UP, /**< Mouse up on the widget */ - WIDGET_MOUSE_MOVE = WIDGET_MOUSE_EVENT_WIDGET_MASK | WIDGET_MOUSE_EVENT_MASK | WIDGET_MOUSE_EVENT_MOVE, /**< Move move on the widget */ - WIDGET_MOUSE_ENTER = WIDGET_MOUSE_EVENT_WIDGET_MASK | WIDGET_MOUSE_EVENT_MASK | WIDGET_MOUSE_EVENT_ENTER, /**< Mouse enter to the widget */ - WIDGET_MOUSE_LEAVE = WIDGET_MOUSE_EVENT_WIDGET_MASK | WIDGET_MOUSE_EVENT_MASK | WIDGET_MOUSE_EVENT_LEAVE, /**< Mouse leave from the widget */ - WIDGET_MOUSE_SET = WIDGET_MOUSE_EVENT_WIDGET_MASK | WIDGET_MOUSE_EVENT_MASK | WIDGET_MOUSE_EVENT_SET, /**< Mouse event, start feeding event by master */ - WIDGET_MOUSE_UNSET = WIDGET_MOUSE_EVENT_WIDGET_MASK | WIDGET_MOUSE_EVENT_MASK | WIDGET_MOUSE_EVENT_UNSET, /**< Mouse event, stop feeding event by master */ - - WIDGET_GBAR_MOUSE_ON_SCROLL = WIDGET_MOUSE_EVENT_GBAR_MASK | WIDGET_MOUSE_EVENT_MASK | WIDGET_MOUSE_EVENT_ON_SCROLL, /**< Mouse event occurs while scrolling */ - WIDGET_GBAR_MOUSE_ON_HOLD = WIDGET_MOUSE_EVENT_GBAR_MASK | WIDGET_MOUSE_EVENT_MASK | WIDGET_MOUSE_EVENT_ON_HOLD, /**< Mouse event occurs on holding */ - WIDGET_GBAR_MOUSE_OFF_SCROLL = WIDGET_MOUSE_EVENT_GBAR_MASK | WIDGET_MOUSE_EVENT_MASK | WIDGET_MOUSE_EVENT_OFF_SCROLL, /**< Scrolling stopped */ - WIDGET_GBAR_MOUSE_OFF_HOLD = WIDGET_MOUSE_EVENT_GBAR_MASK | WIDGET_MOUSE_EVENT_MASK | WIDGET_MOUSE_EVENT_OFF_HOLD, /**< Holding stopped */ - - WIDGET_GBAR_MOUSE_DOWN = WIDGET_MOUSE_EVENT_GBAR_MASK | WIDGET_MOUSE_EVENT_MASK | WIDGET_MOUSE_EVENT_DOWN, /**< Mouse down on the Glance Bar */ - WIDGET_GBAR_MOUSE_UP = WIDGET_MOUSE_EVENT_GBAR_MASK | WIDGET_MOUSE_EVENT_MASK | WIDGET_MOUSE_EVENT_UP, /**< Mouse up on the Glance Bar */ - WIDGET_GBAR_MOUSE_MOVE = WIDGET_MOUSE_EVENT_GBAR_MASK | WIDGET_MOUSE_EVENT_MASK | WIDGET_MOUSE_EVENT_MOVE, /**< Mouse move on the Glance Bar */ - WIDGET_GBAR_MOUSE_ENTER = WIDGET_MOUSE_EVENT_GBAR_MASK | WIDGET_MOUSE_EVENT_MASK | WIDGET_MOUSE_EVENT_ENTER, /**< Mouse enter to the Glance Bar */ - WIDGET_GBAR_MOUSE_LEAVE = WIDGET_MOUSE_EVENT_GBAR_MASK | WIDGET_MOUSE_EVENT_MASK | WIDGET_MOUSE_EVENT_LEAVE, /**< Mouse leave from the Glance Bar */ - WIDGET_GBAR_MOUSE_SET = WIDGET_MOUSE_EVENT_GBAR_MASK | WIDGET_MOUSE_EVENT_MASK | WIDGET_MOUSE_EVENT_SET, /**< Mouse event, start feeding event by master */ - WIDGET_GBAR_MOUSE_UNSET = WIDGET_MOUSE_EVENT_GBAR_MASK | WIDGET_MOUSE_EVENT_MASK | WIDGET_MOUSE_EVENT_UNSET, /**< Mouse event, stop feeding event by master */ - - WIDGET_MOUSE_EVENT_MAX = 0xFFFFFFFF /**< Unknown event */ -} widget_mouse_event_type_e; - -typedef enum widget_key_event_type { - WIDGET_KEY_EVENT_MASK = 0x80000000, /**< Mask value for key event */ - WIDGET_KEY_EVENT_GBAR_MASK = 0x10000000, /**< Mask value for Glance Bar event */ - WIDGET_KEY_EVENT_WIDGET_MASK = 0x40000000, /**< Mask value for widget event */ - - WIDGET_KEY_EVENT_DOWN = 0x00000001, /**< widget key press */ - WIDGET_KEY_EVENT_UP = 0x00000002, /**< widget key release */ - WIDGET_KEY_EVENT_FOCUS_IN = 0x00000008, /**< widget key focused in */ - WIDGET_KEY_EVENT_FOCUS_OUT = 0x00000010, /**< widget key focused out */ - WIDGET_KEY_EVENT_SET = 0x00000020, /**< widget Key, start feeding event by master */ - WIDGET_KEY_EVENT_UNSET = 0x00000040, /**< widget key, stop feeding event by master */ - - WIDGET_KEY_DOWN = WIDGET_KEY_EVENT_MASK | WIDGET_KEY_EVENT_WIDGET_MASK | WIDGET_KEY_EVENT_DOWN, /**< Key down on the widget */ - WIDGET_KEY_UP = WIDGET_KEY_EVENT_MASK | WIDGET_KEY_EVENT_WIDGET_MASK | WIDGET_KEY_EVENT_UP, /**< Key up on the widget */ - WIDGET_KEY_SET = WIDGET_KEY_EVENT_MASK | WIDGET_KEY_EVENT_WIDGET_MASK | WIDGET_KEY_EVENT_SET, /**< Key event, start feeding event by master */ - WIDGET_KEY_UNSET = WIDGET_KEY_EVENT_MASK | WIDGET_KEY_EVENT_WIDGET_MASK | WIDGET_KEY_EVENT_UNSET, /**< Key event, stop feeding event by master */ - WIDGET_KEY_FOCUS_IN = WIDGET_KEY_EVENT_MASK | WIDGET_KEY_EVENT_WIDGET_MASK | WIDGET_KEY_EVENT_FOCUS_IN, /**< Key event, focus in */ - WIDGET_KEY_FOCUS_OUT = WIDGET_KEY_EVENT_MASK | WIDGET_KEY_EVENT_WIDGET_MASK | WIDGET_KEY_EVENT_FOCUS_OUT, /**< Key event, foucs out */ - - WIDGET_GBAR_KEY_DOWN = WIDGET_KEY_EVENT_MASK | WIDGET_KEY_EVENT_GBAR_MASK | WIDGET_KEY_EVENT_DOWN, /**< Key down on the widget */ - WIDGET_GBAR_KEY_UP = WIDGET_KEY_EVENT_MASK | WIDGET_KEY_EVENT_GBAR_MASK | WIDGET_KEY_EVENT_UP, /**< Key up on the widget */ - WIDGET_GBAR_KEY_SET = WIDGET_KEY_EVENT_MASK | WIDGET_KEY_EVENT_GBAR_MASK | WIDGET_KEY_EVENT_SET, /**< Key event, start feeding event by master */ - WIDGET_GBAR_KEY_UNSET = WIDGET_KEY_EVENT_MASK | WIDGET_KEY_EVENT_GBAR_MASK | WIDGET_KEY_EVENT_UNSET, /**< Key event, stop feeding event by master */ - WIDGET_GBAR_KEY_FOCUS_IN = WIDGET_KEY_EVENT_MASK | WIDGET_KEY_EVENT_GBAR_MASK | WIDGET_KEY_EVENT_FOCUS_IN, /**< Key event, focus in */ - WIDGET_GBAR_KEY_FOCUS_OUT = WIDGET_KEY_EVENT_MASK | WIDGET_KEY_EVENT_GBAR_MASK | WIDGET_KEY_EVENT_FOCUS_OUT, /**< Key event, focus out */ - - WIDGET_KEY_EVENT_MAX = 0xFFFFFFFF /**< Unknown event */ -} widget_key_event_type_e; - -/** - * @internal - * @brief Enumeration for Accessibility event for buffer type widget or Glance Bar. - * @details These events are sync'd with Tizen accessibility event set. - * @since_tizen 2.3.1 - */ -typedef enum widget_access_event_type { - WIDGET_ACCESS_EVENT_GBAR_MASK = 0x10000000, /**< Glance Bar Accessibilivent mask */ - WIDGET_ACCESS_EVENT_WIDGET_MASK = 0x20000000, /**< widget Accessibility event mask */ - - WIDGET_ACCESS_EVENT_HIGHLIGHT = 0x00000100, /**< widget accessibility: Hightlight a object, Next, Prev,Unhighlight */ - WIDGET_ACCESS_EVENT_ACTIVATE = 0x00000200, /**< widget accessibility activate */ - WIDGET_ACCESS_EVENT_ACTION = 0x00000400, /**< widget accessibility value changed, Up, Down */ - WIDGET_ACCESS_EVENT_SCROLL = 0x00000800, /**< widget accessibility scroll down, move, up */ - WIDGET_ACCESS_EVENT_VALUE_CHANGE = 0x00001000, /**< LB accessibility value change */ - WIDGET_ACCESS_EVENT_MOUSE = 0x00002000, /**< Give mouse event to highlight object, down, move, up */ - WIDGET_ACCESS_EVENT_BACK = 0x00004000, /**< Go back to a previous view ex: pop naviframe item */ - WIDGET_ACCESS_EVENT_OVER = 0x00008000, /**< Mouse over an object */ - WIDGET_ACCESS_EVENT_READ = 0x00010000, /**< Highlight an object */ - WIDGET_ACCESS_EVENT_ENABLE = 0x00020000, /**< Disable highlight and read ability, disable, enable */ - - WIDGET_ACCESS_HIGHLIGHT = WIDGET_ACCESS_EVENT_WIDGET_MASK | WIDGET_ACCESS_EVENT_HIGHLIGHT, /**< Access event - Highlight an object in the widget */ - WIDGET_ACCESS_ACTIVATE = WIDGET_ACCESS_EVENT_WIDGET_MASK | WIDGET_ACCESS_EVENT_ACTIVATE, /**< Access event - Launch or activate the highlighted object */ - WIDGET_ACCESS_ACTION = WIDGET_ACCESS_EVENT_WIDGET_MASK | WIDGET_ACCESS_EVENT_ACTION, /**< Access event - down */ - WIDGET_ACCESS_SCROLL = WIDGET_ACCESS_EVENT_WIDGET_MASK | WIDGET_ACCESS_EVENT_SCROLL, /**< Access event - scroll down */ - WIDGET_ACCESS_VALUE_CHANGE = WIDGET_ACCESS_EVENT_WIDGET_MASK | WIDGET_ACCESS_EVENT_VALUE_CHANGE, /**< LB accessibility value change */ - WIDGET_ACCESS_MOUSE = WIDGET_ACCESS_EVENT_WIDGET_MASK | WIDGET_ACCESS_EVENT_MOUSE, /**< Give mouse event to highlight object */ - WIDGET_ACCESS_BACK = WIDGET_ACCESS_EVENT_WIDGET_MASK | WIDGET_ACCESS_EVENT_BACK, /**< Go back to a previous view ex: pop naviframe item */ - WIDGET_ACCESS_OVER = WIDGET_ACCESS_EVENT_WIDGET_MASK | WIDGET_ACCESS_EVENT_OVER, /**< Mouse over an object */ - WIDGET_ACCESS_READ = WIDGET_ACCESS_EVENT_WIDGET_MASK | WIDGET_ACCESS_EVENT_READ, /**< Highlight an object */ - WIDGET_ACCESS_ENABLE = WIDGET_ACCESS_EVENT_WIDGET_MASK | WIDGET_ACCESS_EVENT_ENABLE, /**< Enable highlight and read ability */ - - WIDGET_GBAR_ACCESS_HIGHLIGHT = WIDGET_ACCESS_EVENT_GBAR_MASK | WIDGET_ACCESS_EVENT_HIGHLIGHT, /**< Access event - Highlight an object in the Glance Bar */ - WIDGET_GBAR_ACCESS_ACTIVATE = WIDGET_ACCESS_EVENT_GBAR_MASK | WIDGET_ACCESS_EVENT_ACTIVATE, /**< Access event - Launch or activate the highlighted object */ - WIDGET_GBAR_ACCESS_ACTION = WIDGET_ACCESS_EVENT_GBAR_MASK | WIDGET_ACCESS_EVENT_ACTION, /**< Access event - down */ - WIDGET_GBAR_ACCESS_SCROLL = WIDGET_ACCESS_EVENT_GBAR_MASK | WIDGET_ACCESS_EVENT_SCROLL, /**< Access event - scroll down */ - WIDGET_GBAR_ACCESS_VALUE_CHANGE = WIDGET_ACCESS_EVENT_GBAR_MASK | WIDGET_ACCESS_EVENT_VALUE_CHANGE, /**< LB accessibility value change */ - WIDGET_GBAR_ACCESS_MOUSE = WIDGET_ACCESS_EVENT_GBAR_MASK | WIDGET_ACCESS_EVENT_MOUSE, /**< Give mouse event to highlight object */ - WIDGET_GBAR_ACCESS_BACK = WIDGET_ACCESS_EVENT_GBAR_MASK | WIDGET_ACCESS_EVENT_BACK, /**< Go back to a previous view ex: pop naviframe item */ - WIDGET_GBAR_ACCESS_OVER = WIDGET_ACCESS_EVENT_GBAR_MASK | WIDGET_ACCESS_EVENT_OVER, /**< Mouse over an object */ - WIDGET_GBAR_ACCESS_READ = WIDGET_ACCESS_EVENT_GBAR_MASK | WIDGET_ACCESS_EVENT_READ, /**< Highlight an object */ - WIDGET_GBAR_ACCESS_ENABLE = WIDGET_ACCESS_EVENT_GBAR_MASK | WIDGET_ACCESS_EVENT_ENABLE, /**< Enable highlight and read ability */ - WIDGET_GBAR_ACCESS_EVENT_MAX = 0xFFFFFFFF -} widget_access_event_type_e; - -/** - * @internal - * @brief Enumeration for widget content type. - * @since_tizen 2.3.1 - */ -typedef enum widget_type { - WIDGET_CONTENT_TYPE_IMAGE = 0x01, /**< Contents of a widget is based on the image file */ - WIDGET_CONTENT_TYPE_BUFFER = 0x02, /**< Contents of a widget is based on canvas buffer(shared) */ - WIDGET_CONTENT_TYPE_TEXT = 0x04, /**< Contents of a widget is based on formatted text file */ - WIDGET_CONTENT_TYPE_RESOURCE_ID = 0x08, /**< Contens of a widget is shared by the resource id(depends on window system) */ - WIDGET_CONTENT_TYPE_UIFW = 0x10, /**< Using UI F/W resource for sharing content & event */ - WIDGET_CONTENT_TYPE_INVALID = 0xFF /**< Unknown widget type */ -} widget_type_e; - -/** - * @brief Enumeration for widget option types. - * @since_tizen 2.3.1 - */ -typedef enum widget_option_type { - WIDGET_OPTION_MANUAL_SYNC, /**< Sync frame manually */ - WIDGET_OPTION_FRAME_DROP_FOR_RESIZE, /**< Drop frames while resizing */ - WIDGET_OPTION_SHARED_CONTENT, /**< Use only one real instance for multiple fake instances if user creates widget for same content */ - WIDGET_OPTION_DIRECT_UPDATE, /**< Use the private socket for receiving updated event */ - WIDGET_OPTION_EXTRA_BUFFER_CNT, /**< Extra buffer count, ReadOnly value */ - - WIDGET_OPTION_ERROR = 0xFFFFFFFF /**< To specify the size of this enumeration type */ -} widget_option_type_e; - -/** - * @internal - * @brief Reason of faults - * @since_tizen 2.3.1 - */ -typedef enum widget_fault_type { - WIDGET_FAULT_DEACTIVATED, /**< widget is deactivated by its fault operation */ - WIDGET_FAULT_PROVIDER_DISCONNECTED, /**< Provider is disconnected */ - WIDGET_FAULT_MAX = 0xFF /**< To specify the size of this enumeration type, some compiler enjoy of this kind of notation */ -} widget_fault_type_e; - -/** - * @brief Enumeration for widget visible states. - * @details Must be sync'd with a provider. - * @since_tizen 2.3.1 - */ -typedef enum widget_visible_state { - WIDGET_SHOW = 0x00, /**< widget is shown. Default state */ - WIDGET_HIDE = 0x01, /**< widget is hidden, Update timer will not be freezed. but you cannot receive any updates events. */ - - WIDGET_HIDE_WITH_PAUSE = 0x02, /**< widget is hidden, it will pause the update timer, but if a widget updates its contents, update event will be triggered */ - - WIDGET_VISIBLE_ERROR = 0xFF /**< To specify the size of this enumeration type */ -} widget_visible_state_e; - -/** - * @internal - * @brief Accessibility Event type - * @since_tizen 2.3.1 - * @see widget_feed_access_event() - */ -typedef enum widget_access_info_type { - WIDGET_ACCESS_TYPE_NONE = 0x00, /**< Initialized */ - - WIDGET_ACCESS_TYPE_DOWN = 0x00, /**< Mouse down */ - WIDGET_ACCESS_TYPE_MOVE = 0x01, /**< Mouse move */ - WIDGET_ACCESS_TYPE_UP = 0x02, /**< Mouse up */ - - WIDGET_ACCESS_TYPE_HIGHLIGHT = 0x00, /**< Highlight */ - WIDGET_ACCESS_TYPE_HIGHLIGHT_NEXT = 0x01, /**< Highlight next */ - WIDGET_ACCESS_TYPE_HIGHLIGHT_PREV = 0x02, /**< Highlight prev */ - WIDGET_ACCESS_TYPE_UNHIGHLIGHT = 0x03, /**< Unhighlight */ - - WIDGET_ACCESS_TYPE_DISABLE = 0x00, /**< Disable */ - WIDGET_ACCESS_TYPE_ENABLE = 0x01 /**< Enable */ -} widget_access_info_type_e; - -/** - * @internal - * @brief Accessibility Event Information - * @since_tizen 2.3.1 - */ -typedef struct widget_access_event_info { - double x; /**< X Coordinates that the event occurred */ - double y; /**< Y Coordinates that the event occurred */ - widget_access_info_type_e type; /**< Accessibility event type */ - int info; /**< Extra information for this event */ -} *widget_access_event_info_s; - -/** - * @internal - * @brief Damaged Region representation - * @since_tizen 2.3.1 - */ -typedef struct widget_damage_region { - int x; /**< Coordinates X of Left-Top corner */ - int y; /**< Coordinates Y of Left-Top corner */ - int w; /**< Damage'd Width */ - int h; /**< Damage'd Height */ -} widget_damage_region_s; - -/** - * @internal - * @brief Mouse Event Information - * @since_tizen 2.3.1 - */ -typedef struct widget_mouse_event_info { - double x; /**< X coordinates of Mouse Event */ - double y; /**< Y coordinates of Mouse Event */ - double ratio_w; - double ratio_h; - int device; -} *widget_mouse_event_info_s; - -/** - * @internal - * @brief Key Event Information - * @since_tizen 2.3.1 - */ -typedef struct widget_key_event_info { - unsigned int keycode; /**< Key code */ - int device; -} *widget_key_event_info_s; - -/** - * @internal - * @brief Structure for TEXT type widget contents handling opertators. - * @since_tizen 2.3.1 - */ -typedef struct widget_script_operators { - int (*update_begin)(widget_h handle); /**< Content parser is started */ - int (*update_end)(widget_h handle); /**< Content parser is finished */ - - /* Listed functions will be called when parser meets each typed content */ - int (*update_text)(widget_h handle, const char *id, const char *part, const char *data); /**< Update text content */ - int (*update_image)(widget_h handle, const char *id, const char *part, const char *data, const char *option); /**< Update image content */ - int (*update_script)(widget_h handle, const char *id, const char *new_id, const char *part, const char *file, const char *group); /**< Update script content */ - int (*update_signal)(widget_h handle, const char *id, const char *signal_name, const char *signal); /**< Update signal */ - int (*update_drag)(widget_h handle, const char *id, const char *part, double dx, double dy); /**< Update drag info */ - int (*update_info_size)(widget_h handle, const char *id, int w, int h); /**< Update content size */ - int (*update_info_category)(widget_h handle, const char *id, const char *category); /**< Update content category info */ - int (*update_access)(widget_h handle, const char *id, const char *part, const char *text, const char *option); /**< Update access information */ - int (*operate_access)(widget_h handle, const char *id, const char *part, const char *operation, const char *option); /**< Update access operation */ - int (*update_color)(widget_h handle, const char *id, const char *part, const char *data); /**< Update color */ -} *widget_script_operator_s; - -/** - * @internal - * @brief Called for every async function. - * @details Prototype of the return callback of every async functions. - * @since_tizen 2.3.1 - * @param[in] handle Handle of the widget instance - * @param[in] ret Result status of operation (WIDGET_STATUS_XXX defined from libwidget-service) - * @param[in] data Data for result callback - * @see widget_add() - * @see widget_del() - * @see widget_activate() - * @see widget_resize() - * @see widget_set_group() - * @see widget_set_period() - * @see widget_access_event() - * @see widget_set_pinup() - * @see widget_create_glance_bar() - * @see widget_destroy_glance_bar() - * @see widget_emit_text_signal() - * @see widget_acquire_resource_id() - * @see widget_set_update_mode() - */ -typedef void (*widget_ret_cb)(widget_h handle, int ret, void *data); - -/** - * @internal - * @brief Fault event handle - * @param[in] type Type of fault event. - * @param[in] widget_id Faulted widget Id - * @param[in] file faulted filename (implementation file if it is supported) - * @param[in] func faulted function name (if it is supported) - * @param[in] data Callback data - * @return 0 on success, otherwise a negative error value - * @retval @c EXIT_FAILURE delete this event callback from the event callback list - * @retval @c EXIT_SUCCESS successfully handled, keep this callback in the event callback list - */ -typedef int (*widget_fault_handler_cb)(enum widget_fault_type type, const char *widget_id, const char *file, const char *func, void *data); - -/** - * @brief Event handle - * @since_tizen 2.3.1 - * @param[in] handle widget Event handle - * @param[in] event Event type for widget - * @param[in] data Callback Data - * @return 0 on success, otherwise a negative error value - * @return @c EXIT_FAILURE delete this event callback from the event callback list - * @return @c EXIT_SUCCESS successfully handled, keep this callback in the event callback list - */ -typedef int (*widget_event_handler_cb)(widget_h handle, widget_event_type_e event, void *data); - -/** - * @brief Auto launch handle - * @since_tizen 2.3.1 - * @param[in] handle widget Handle - * @param[in] appid UI Application Id, which should be launched - * @param[in] data callback data - */ -typedef int (*widget_auto_launch_handler_cb)(widget_h handle, const char *appid, void *data); - -/** - * @internal - * @brief Initializes the widget system with some options. - * @details widget_init function uses environment value to initiate some configurable values. - * But some applications do not want to use the env value. - * For them, this API will give a chance to set default options using given arguments. - * @a disp is a Display object which is used to hold a connection with a display server (eg, Xorg) - * @since_tizen 2.3.1 - * @param[in] disp Display, If @a disp is @c NULL, the library will try to acquire a new connection to display server - * @param[in] prevent_overwrite Overwrite flag (when the content of an image type widget is updated, it will be overwriten (0) or not (1)) - * @param[in] event_filter If the widget_feed_mouse_event() is called again in this secs, it will be ignored and the widget_feed_mouse_event() will returns WIDGET_STATUS_ERROR_BUSY status code - * @param[in] use_thread If this value has true, the viewer library will create a new thread to communicate with master service - * @privlevel platform - * @privilege %http://tizen.org/privilege/widget.viewer - * @return #WIDGET_STATUS_ERROR_NONE on success, - * otherwise an error code (see #WIDGET_STATUS_ERROR_XXX) on failure - * @retval #WIDGET_STATUS_ERROR_OUT_OF_MEMORY If a memory is not enough to do this operation. - * @retval #WIDGET_STATUS_ERROR_IO_ERROR If fails to access widget database. - * @see widget_fini() - * @see widget_feed_mouse_event() - */ -extern int widget_viewer_init(void *disp, int prevent_overwrite, double event_filter, int use_thread); - -/** - * @internal - * @brief Finalizes the widget system. - * @since_tizen 2.3.1 - * @privlevel platform - * @privilege %http://tizen.org/privilege/widget.viewer - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_STATUS_SUCCES if success - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER if widget_init is not called - * @see widget_init() - */ -extern int widget_viewer_fini(void); - -/** - * @brief Notifies the status of a client ("it is paused") to the provider. - * @since_tizen 2.3.1 - * @privlevel public - * @privilege %http://tizen.org/privilege/widget.viewer - * @return #WIDGET_STATUS_ERROR_NONE on success, - * otherwise an error code (see #WIDGET_STATUS_ERROR_XXX) on failure - * @retval #WIDGET_STATUS_ERROR_FAULT if it failed to send state (paused) info - * @see widget_client_set_resumed() - */ -extern int widget_viewer_notify_paused_status_of_viewer(void); - -/** - * @brief Notifies the status of client ("it is resumed") to the provider. - * @since_tizen 2.3.1 - * @privlevel public - * @privilege %http://tizen.org/privilege/widget.viewer - * @return #WIDGET_STATUS_ERROR_NONE on success, - * otherwise an error code (see #WIDGET_STATUS_ERROR_XXX) on failure - * @retval #WIDGET_STATUS_ERROR_FAULT if it failed to send state (resumed) info - * @see widget_client_set_paused() - */ -extern int widget_viewer_notify_resumed_status_of_viewer(void); - -/** - * @internal - * @brief Adds a new widget. - * @details If the screen size is "1280x720", the below size lists are used for default. - * Or you can find the default sizes in pixel from /usr/share/data-provider-master/resolution.ini. - * Size types are defined from the libwidget-service package (widget-service.h). - * - * Normal mode widget - * 1x1=175x175, #WIDGET_SIZE_TYPE_1x1 - * 2x1=354x175, #WIDGET_SIZE_TYPE_2x1 - * 2x2=354x354, #WIDGET_SIZE_TYPE_2x2 - * 4x1=712x175, #WIDGET_SIZE_TYPE_4x1 - * 4x2=712x354, #WIDGET_SIZE_TYPE_4x2 - * 4x4=712x712, #WIDGET_SIZE_TYPE_4x4 - * - * Extended sizes - * 4x3=712x533, #WIDGET_SIZE_TYPE_4x3 - * 4x5=712x891, #WIDGET_SIZE_TYPE_4x5 - * 4x6=712x1070, #WIDGET_SIZE_TYPE_4x6 - * - * Easy mode widget - * 21x21=224x215, #WIDGET_SIZE_TYPE_EASY_1x1 - * 23x21=680x215, #WIDGET_SIZE_TYPE_EASY_3x1 - * 23x23=680x653, #WIDGET_SIZE_TYPE_EASY_3x3 - * - * Special widget - * 0x0=720x1280, #WIDGET_SIZE_TYPE_FULL - * @since_tizen 2.3.1 - * @remarks - * This is an ASYNCHRONOUS API. - * Even if you get a handle from the return value of this function, it is not a created instance. - * So you have to consider it as a not initialized handle. - * It can be initialized only after getting the return callback with "ret == #WIDGET_STATUS_ERROR_NONE" - * This function is Asynchronous, so you will get result of add requst from @a cb, if you failed to send request to create a new widget, - * This function will returns proper error code - * If this returns @c NULL, you can get the reason of failure using get_last_result() - * @param[in] widget_id widget Id - * @param[in] content Contents that will be given to the widget instance - * @param[in] cluster Identifier to group widgets which will be decided in runtime. - * @param[in] category Identifier to group widgets declared in the manifest file by the widget application. - * @param[in] period Update period (@c WIDGET_DEFAULT_PERIOD can be used for this; this argument will be used to specify the period of updating contents of a widget) - * @param[in] type Size type (defined from libwidget-service package) - * @param[in] cb After the request is sent to the master provider, this callback will be called - * @param[in] data This data will be passed to the callback - * @privlevel platform - * @privilege %http://tizen.org/privilege/widget.viewer - * @return handle - * @retval Handle widget handle but not yet initialized - * @retval @c NULL if it fails to create a handle - * @see widget_ret_cb - */ -extern widget_h widget_viewer_add_widget(const char *widget_id, const char *content, const char *cluster, const char *category, double period, widget_size_type_e type, widget_ret_cb cb, void *data); - -/** - * @internal - * @brief Deletes a widget (will replace widget_del). - * @since_tizen 2.3.1 - * @remarks - * This is an ASYNCHRONOUS API. - * If you call this with an uninitialized handle, the return callback will be called synchronously. - * So before returning from this function, the return callback will be called first. - * This function is Asynchronous, so you will get result of add requst from @a cb, if you failed to send request to create a new widget, - * This function will returns proper error code - * @param[in] handle Handle of a widget instance - * @param[in] type Deletion type (WIDGET_DELETE_PERMANENTLY or WIDGET_DELETE_TEMPORARY) - * @param[in] cb Return callback - * @param[in] data User data for return callback - * @privlevel platform - * @privilege %http://tizen.org/privilege/widget.viewer - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER Invalid argument - * @retval #WIDGET_STATUS_ERROR_BUSY Already in process - * @retval #WIDGET_STATUS_ERROR_FAULT Failed to create a request packet - * @retval #WIDGET_STATUS_ERROR_NONE Successfully sent, return callack will be called - * @see widget_ret_cb - */ -extern int widget_viewer_delete_widget(widget_h handle, widget_delete_type_e type, widget_ret_cb cb, void *data); - -/** - * @internal - * @brief Sets a widget events callback. - * @details To get the event which is pushed from the provider, Register the event callback using this API. - * The registered callback will be invoked if there are any events from the provider. - * @since_tizen 2.3.1 - * @param[in] cb Event handle - * @param[in] data User data for the event handle - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_STATUS_ERROR_NONE If succeed to set event handle - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER Invalid argument - * @retval #WIDGET_STATUS_ERROR_OUT_OF_MEMORY Not enough memory - * @see widget_unset_event_handler() - */ -extern int widget_viewer_add_event_handler(widget_event_handler_cb cb, void *data); - -/** - * @brief Unsets the widget event handle. - * @since_tizen 2.3.1 - * @privlevel public - * @privilege %http://tizen.org/privilege/widget.viewer - * @param[in] cb Event handle - * @retval pointer Pointer of 'data' which is used with the widget_set_event_handler - * @see widget_set_event_handler() - */ -extern void *widget_viewer_remove_event_handler(widget_event_handler_cb cb); - -/** - * @internal - * @brief Registers the widget fault event handle. - * @details Argument list: event, pkgname, filename, funcname. - * @since_tizen 2.3.1 - * @param[in] cb Event handle - * @param[in] data Event handle data - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_STATUS_ERROR_NONE If succeed to set fault event handle - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER Invalid argument - * @retval #WIDGET_STATUS_ERROR_OUT_OF_MEMORY Not enough memory - * @see widget_unset_fault_handler() - */ -extern int widget_viewer_add_fault_handler(widget_fault_handler_cb cb, void *data); - -/** - * @brief Unsets the widget fault event handle. - * @since_tizen 2.3.1 - * * @param[in] cb Event handle - * @retval pointer Pointer of 'data' which is used with the widget_set_fault_handler - * @see widget_set_fault_handler() - */ -extern void *widget_viewer_remove_fault_handler(widget_fault_handler_cb cb); - -/** - * @internal - * @brief Activates the faulted widget. - * @details Request result will be returned via return callback. - * @since_tizen 2.3.1 - * @remarks - * This is an ASYNCHRONOUS API. - * Even though this function returns ERROR_NONE, it means that it just successfully sent a request to the provider. - * So you have to check the return callback and its "ret" argument. - * This function is Asynchronous, so you will get result of add requst from @a cb, if you failed to send request to create a new widget, - * This function will returns proper error code - * @param[in] widget_id Package name which should be activated - * @param[in] cb Result callback - * @param[in] data Callback data - * @privlevel platform - * @privilege %http://tizen.org/privilege/widget.viewer - * @return #WIDGET_STATUS_ERROR_NONE on success, - * otherwise an error code (see #WIDGET_STATUS_ERROR_XXX) on failure - * @retval #WIDGET_STATUS_ERROR_NONE Successfully sent a request - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER Invalid argument - * @retval #WIDGET_STATUS_ERROR_FAULT Failed to make a request - * @see widget_ret_cb - */ -extern int widget_viewer_activate_faulted_widget(const char *widget_id, widget_ret_cb cb, void *data); - -/** - * @internal - * @brief Resizes the widget. - * @details - * Normal mode widget size - * 1x1=175x175, WIDGET_SIZE_TYPE_1x1 - * 2x1=354x175, WIDGET_SIZE_TYPE_2x1 - * 2x2=354x354, WIDGET_SIZE_TYPE_2x2 - * 4x1=712x175, WIDGET_SIZE_TYPE_4x1 - * 4x2=712x354, WIDGET_SIZE_TYPE_4x2 - * 4x4=712x712, WIDGET_SIZE_TYPE_4x4 - * - * Extended widget size - * 4x3=712x533, WIDGET_SIZE_TYPE_4x3 - * 4x5=712x891, WIDGET_SIZE_TYPE_4x5 - * 4x6=712x1070, WIDGET_SIZE_TYPE_4x6 - * - * Easy mode widget size - * 21x21=224x215, WIDGET_SIZE_TYPE_EASY_1x1 - * 23x21=680x215, WIDGET_SIZE_TYPE_EASY_3x1 - * 23x23=680x653, WIDGET_SIZE_TYPE_EASY_3x3 - * - * Special mode widget size - * 0x0=720x1280, WIDGET_SIZE_TYPE_FULL - * @since_tizen 2.3.1 - * @privlevel public - * @privilege %http://tizen.org/privilege/widget.viewer - * @remarks - * This is an ASYNCHRONOUS API. - * This function is Asynchronous, so you will get result of add requst from @a cb, if you failed to send request to create a new widget, - * This function will returns proper error code - * @param[in] handle Handle of a widget instance - * @param[in] type Type of a widget size (e.g., WIDGET_SIZE_TYPE_1x1, ...) - * @param[in] cb Result callback of the resize operation - * @param[in] data User data for return callback - * @privlevel platform - * @privilege %http://tizen.org/privilege/widget.viewer - * @return #WIDGET_STATUS_ERROR_NONE on success, - * otherwise an error code (see #WIDGET_STATUS_ERROR_XXX) on failure - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER Invalid argument - * @retval #WIDGET_STATUS_ERROR_BUSY Previous request of resize is in progress - * @retval #WIDGET_STATUS_ERROR_ALREADY Already resized, there is no differences between current size and requested size - * @retval #WIDGET_STATUS_ERROR_PERMISSION_DENIED Permission denied, you only have view the content of this box - * @retval #WIDGET_STATUS_ERROR_FAULT Failed to make a request - * @see widget_ret_cb - */ -extern int widget_viewer_resize_widget(widget_h handle, widget_size_type_e type, widget_ret_cb cb, void *data); - -/** - * @internal - * @brief Sends the click event to a widget, This is not related with mouse_event, viewer can send "clicked" event directly. - * @since_tizen 2.3.1 - * @param[in] handle Handle of a widget instance - * @param[in] x Rational X of the content width - * @param[in] y Rational Y of the content height - * @privlevel platform - * @privilege %http://tizen.org/privilege/widget.viewer - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER Invalid argument - * @retval #WIDGET_STATUS_ERROR_FAULT Unrecoverable error occurred - * @retval #WIDGET_STATUS_ERROR_NONE Successfully done - */ -extern int widget_viewer_send_click_event(widget_h handle, const char *event, double x, double y); - -/** - * @internal - * @brief Changes the cluster/sub-cluster name of the given widget handle. - * @since_tizen 2.3.1 - * @remarks - * This is an ASYNCHRONOUS API. - * This function is Asynchronous, so you will get result of add requst from @a cb, if you failed to send request to create a new widget, - * This function will returns proper error code - * @param[in] handle Handle of a widget instance - * @param[in] cluster New cluster of a widget - * @param[in] category New category of a widget - * @param[in] cb Result callback for changing the cluster/category of a widget - * @param[in] data User data for the result callback - * @privlevel platform - * @privilege %http://tizen.org/privilege/widget.viewer - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_STATUS_ERROR_NONE Request is successfully sent. the return callback will be called - * @retval #WIDGET_STATUS_ERROR_BUSY Previous request is not finished yet - * @retval #WIDGET_STATUS_ERROR_ALREADY Group name is same with current one - * @retval #WIDGET_STATUS_ERROR_PERMISSION_DENIED You have no permission to change property of this widget instance - * @retval #WIDGET_STATUS_ERROR_FAULT Failed to make a request - * @see widget_ret_cb - */ -extern int widget_viewer_set_group(widget_h handle, const char *cluster, const char *category, widget_ret_cb cb, void *data); - -/** - * @internal - * @brief Gets the cluster and category (sub-cluster) name of the given widget (it is not I18N format, only English). - * @since_tizen 2.3.1 - * @remarks You have to do not release the cluster & category. - * It is allocated inside of a given widget instance, so you can only read it. - * @param[in] handle Handle of a widget instance - * @param[out] cluster Storage(memory) for containing the cluster name - * @param[out] category Storage(memory) for containing the category name - * @return #WIDGET_STATUS_ERROR_NONE on success, - * otherwise an error code (see #WIDGET_STATUS_ERROR_XXX) on failure - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER Invalid argument - * @retval #WIDGET_STATUS_ERROR_NONE Successfully done - */ -extern int widget_viewer_get_group(widget_h handle, const char **cluster, const char **category); - -/** - * @brief Gets the update period of the widget. - * @since_tizen 2.3.1 - * * @param[in] handle Handle of a widget instance - * @param[out] period Update period of the widget. - * @return #WIDGET_STATUS_ERROR_NONE on success, - * otherwise an error code (see #WIDGET_STATUS_ERROR_XXX) on failure - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER Invalid parameters - */ -extern int widget_viewer_get_period(widget_h handle, double *period); - -/** - * @internal - * @brief Changes the update period. - * @since_tizen 2.3.1 - * @remarks - * This is an ASYNCHRONOUS API. - * This function is Asynchronous, so you will get result of add requst from @a cb, if you failed to send request to create a new widget, - * This function will returns proper error code - * @param[in] handle Handle of a widget instance - * @param[in] period New update period of a widget - * @param[in] cb Result callback of changing the update period of this widget - * @param[in] data User data for the result callback - * @privlevel platform - * @privilege %http://tizen.org/privilege/widget.viewer - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_STATUS_ERROR_NONE Successfully done - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER Invalid argument - * @retval #WIDGET_STATUS_ERROR_BUSY - * @retval #WIDGET_STATUS_ERROR_ALREADY - * @retval #WIDGET_STATUS_ERROR_FAULT Unrecoverable error occurred - * @see widget_ret_cb - */ -extern int widget_viewer_set_period(widget_h handle, double period, widget_ret_cb cb, void *data); - -/** - * @brief Checks whether the given widget is a text type or not. - * @remarks - * If this returns WIDGET_CONTENT_TYPE_INVALID, you can get the reason of failure using get_last_result() - * @since_tizen 2.3.1 - * * @param[in] handle Handle of a widget instance - * @param[in] gbar 1 for Glance Bar or 0 - * @return widget_type - * @retval #WIDGET_CONTENT_TYPE_IMAGE Contents of a widget is based on the image file - * @retval #WIDGET_CONTENT_TYPE_BUFFER Contents of a widget is based on canvas buffer(shared) - * @retval #WIDGET_CONTENT_TYPE_TEXT Contents of a widget is based on formatted text file - * @retval #WIDGET_CONTENT_TYPE_RESOURCE_ID Contens of a widget is shared by the resource id (depends on the Window system, eg, Xorg) - * @retval #WIDGET_CONTENT_TYPE_UIFW UI F/W supported content type for widget - * @retval #WIDGET_CONTENT_TYPE_INVALID Invalid type - * @see widget_type() - */ -extern int widget_viewer_get_type(widget_h handle, int gbar, widget_type_e *widget_type); - -/** - * @brief Checks if the given widget is created by user or not. - * @remarks if this returns negative value, you can get the reason of failure using get_last_result() - * @since_tizen 2.3.1 - * @privlevel public - * @privilege %http://tizen.org/privilege/widget.viewer - * @details If the widget instance is created by a system this will return 0. - * @param[in] handle Handle of a widget instance - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER Invalid argument - * @retval 0 Automatically created widget by the provider - * @retval 1 Created by user via widget_add() - * @see widget_add() - * @see widget_set_event_handler() - */ -extern int widget_viewer_is_created_by_user(widget_h handle); - -/** - * @internal - * @brief Gets content information string of the given widget. - * @remarks if this returns @c NULL, you can get the reason of failure using get_last_result() - * @since_tizen 2.3.1 - * @param[in] handle Handle of a widget instance - * @return const char * - * @retval content_info widget content info that can be used again via content_info argument of widget_add() - * @see widget_add() - */ -extern const char *widget_viewer_get_content_string(widget_h handle); - -/** - * @brief Gets the sub cluster title string of the given widget. - * @details This API is now used for accessibility. - * Each box should set their content as a string to be read by TTS. - * So if the box has focused on the homescreen, the homescreen will read text using this API. - * @since_tizen 2.3.1 - * * @remarks The title returned by this API can be read by TTS. - * But it is just recomendation for the homescreen. - * So, to read it or not depends on its implementation. - * if this returns @c NULL, you can get the reason of failure using get_last_result() - * @param[in] handle Handle of a widget instance - * @return const char * - * @retval sub Cluster name - * @retval @c NULL - */ -extern const char *widget_viewer_get_title_string(widget_h handle); - -/** - * @internal - * @brief Gets the filename of the given widget, if it is an IMAGE type widget. - * @details If the box is developed as an image format to represent its contents, the homescreen should know its image file name. - * @remarks if this returns @c NULL, you can get the reason of failure using get_last_result() - * @since_tizen 2.3.1 - * @param[in] handle Handle of a widget instance - * @return const char * - * @retval filename If the widget type is image this function will give you a abs-path of an image file (content is rendered) - * @retval @c NULL If this has no image file or type is not image file. - */ -extern const char *widget_viewer_get_filename(widget_h handle); - -/** - * @brief Gets the package name of the given widget handle. - * @remarks if this returns @c NULL, you can get the reason of failure using get_last_result() - * @since_tizen 2.3.1 - * * @param[in] handle Handle of a widget instance - * @return const char * - * @retval pkgname Package name - * @retval @c NULL If the handle is not valid - */ -extern const char *widget_viewer_get_pkgname(widget_h handle); - -/** - * @brief Gets the priority of a current content. - * @remarks if this returns negative value, you can get the reason of failure using get_last_result() - * @since_tizen 2.3.1 - * * @param[in] handle Handle of a widget instance - * @param[out] priority priority of the widget - * @return #WIDGET_STATUS_ERROR_NONE on success, - * otherwise an error code (see #WIDGET_STATUS_ERROR_XXX) on failure - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER Invalid parameters - */ -extern int widget_viewer_get_priority(widget_h handle, double *priority); - -/** - * @internal - * @brief Acquires the buffer of a given widget (only for the buffer type). - * @since_tizen 2.3.1 - * @param[in] handle Handle of a widget instance - * @param[in] gbar 1 for Glance Bar or 0 - * @privlevel platform - * @privilege %http://tizen.org/privilege/widget.viewer - * @retval address Address of a Frame Buffer - * @retval @c NULL If it fails to get buffer address - */ -extern void *widget_viewer_acquire_buffer(widget_h handle, int gbar); - -/** - * @brief Releases the buffer of a widget (only for the buffer type). - * @since_tizen 2.3.1 - * @privlevel public - * @privilege %http://tizen.org/privilege/widget.viewer - * @param[in] buffer Buffer - * @privlevel platform - * @privilege %http://tizen.org/privilege/widget.viewer - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER Invalid argument - * @retval #WIDGET_STATUS_ERROR_NONE Successfully done - * @see widget_acquire_buffer() - */ -extern int widget_viewer_release_buffer(void *buffer); - -/** - * @internal - * @brief Gets the reference count of widget buffer (only for the buffer type). - * @since_tizen 2.3.1 - * @param[in] buffer Buffer - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER Invalid argument - * @retval #WIDGET_STATUS_ERROR_FAULT Unrecoverable error occurred - * @retval refcnt Positive integer value including ZERO - */ -extern int widget_viewer_get_buffer_reference_count(void *buffer); - -/** - * @brief Gets the size of the widget. - * @remarks - * If this returns WIDGET_SIZE_TYPE_UNKNOWN, you can get the reason of failure using get_last_result() - * @since_tizen 2.3.1 - * @privlevel public - * @privilege %http://tizen.org/privilege/widget.viewer - * @param[in] handle Handle of a widget instance - * @return widget_size_type_e - * @retval #WIDGET_SIZE_TYPE_NxM N by M size - * @retval #WIDGET_SIZE_TYPE_UNKNOWN Invalid handle or size type is not defined yet - */ -extern int widget_viewer_get_size_type(widget_h handle, widget_size_type_e *size_type); - -/** - * @internal - * @brief Gets the size of the Glance Bar. - * @since_tizen 2.3.1 - * @param[in] handle Handle of a widget instance - * @param[out] w Width of glance bar in pixels - * @param[out] h Height of glance bar in pixels - * @return #WIDGET_STATUS_ERROR_NONE on success, - * otherwise an error code (see #WIDGET_STATUS_ERROR_XXX) on failure - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER Invalid parameters are used - * @retval #WIDGET_STATUS_ERROR_NONE Successfully done - */ -extern int widget_viewer_get_glance_bar_size(widget_h handle, int *w, int *h); - -/** - * @internal - * @brief Gets a list of the supported sizes of a given handle. - * @since_tizen 2.3.1 - * @param[in] handle Handle of a widget instance - * @param[in] size_list Array buffer for getting the size types - * @param[in] cnt size of array - * @param[out] cnt Count of returned size types - * @param[out] size_list Array of size types - * @return #WIDGET_STATUS_ERROR_NONE on success, - * otherwise an error code (see #WIDGET_STATUS_ERROR_XXX) on failure - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER Invalid argument - * @retval #WIDGET_STATUS_ERROR_NONE Successfully done - */ -extern int widget_viewer_get_supported_sizes(widget_h handle, int *cnt, widget_size_type_e *size_list); - -/** - * @internal - * @brief Gets BUFFER SIZE of the widget if it is a buffer type. - * @since_tizen 2.3.1 - * @param[in] handle Handle of a widget instance - * @param[in] gbar 1 for Glance Bar or 0 - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER Invalid argument - * @retval size Size in bytes of the widget buffer - */ -extern int widget_viewer_get_buffer_size(widget_h handle, int gbar); - -/** - * @internal - * @brief Sends a content event (for buffer type) to the provider (widget). - * @since_tizen 2.3.1 - * @param[in] handle Handle of a widget instance - * @param[in] type Event type - * @param[in] x Coordinates of X axis - * @param[in] y Coordinates of Y axis - * @privlevel platform - * @privilege %http://tizen.org/privilege/widget.viewer - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER Invalid argument - * @retval #WIDGET_STATUS_ERROR_BUSY Previous operation is not finished yet - * @retval #WIDGET_STATUS_ERROR_FAULT Unrecoverable error occurred - * @retval #WIDGET_STATUS_ERROR_NONE Successfully sent - * @see widget_feed_access_event() - * @see widget_feed_key_event() - */ -extern int widget_viewer_feed_mouse_event(widget_h handle, widget_mouse_event_type_e type, widget_mouse_event_info_s info); - -/** - * @internal - * @brief Sends an access event (for buffer type) to the provider (widget). - * @remarks - * This is an ASYNCHRONOUS API. - * @since_tizen 2.3.1 - * @param[in] handle Handle of a widget instance - * @param[in] type Event type - * @param[in] x Coordinates of X axsis - * @param[in] y Coordinates of Y axsis - * @param[in] cb Result callback function - * @param[in] data Callback data - * @privlevel platform - * @privilege %http://tizen.org/privilege/widget.viewer - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER Invalid argument - * @retval #WIDGET_STATUS_ERROR_BUSY Previous operation is not finished yet - * @retval #WIDGET_STATUS_ERROR_FAULT Unrecoverable error occurred - * @retval #WIDGET_STATUS_ERROR_NONE Successfully sent - * @see widget_feed_mouse_event() - * @see widget_feed_key_event() - */ -extern int widget_viewer_feed_access_event(widget_h handle, widget_access_event_type_e type, widget_access_event_info_s info, widget_ret_cb cb, void *data); - -/** - * @internal - * @brief Sends a key event (for buffer type) to the provider (widget). - * @remarks - * This is an ASYNCHRONOUS API. - * @since_tizen 2.3.1 - * @param[in] handle Handle of a widget instance - * @param[in] type Key event type - * @param[in] keycode Code of key - * @param[in] cb Result callback - * @param[in] data Callback data - * @privlevel platform - * @privilege %http://tizen.org/privilege/widget.viewer - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER Invalid argument - * @retval #WIDGET_STATUS_ERROR_BUSY Previous operation is not finished yet - * @retval #WIDGET_STATUS_ERROR_FAULT Unrecoverable error occurred - * @retval #WIDGET_STATUS_ERROR_NONE Successfully sent - * @see widget_feed_mouse_event() - * @see widget_feed_access_event() - */ -extern int widget_viewer_feed_key_event(widget_h handle, widget_key_event_type_e type, widget_key_event_info_s info, widget_ret_cb cb, void *data); - -/** - * @internal - * @brief Sets pin-up status of the given handle. - * @details If the widget supports the pinup feature, - * you can freeze the update of the given widget. - * But it is different from pause. - * The box will be updated and it will decide wheter update its content or not when the pinup is on. - * @remarks - * This is an ASYNCHRONOUS API. - * @since_tizen 2.3.1 - * @param[in] handle Handle of a widget instance - * @param[in] flag Pinup value - * @param[in] cb Result callback - * @param[in] data Callback data - * @privlevel platform - * @privilege %http://tizen.org/privilege/widget.viewer - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER Invalid parameters - * @see widget_ret_cb - * @see widget_set_visibility() - * @see widget_is_pinned_up() - */ -extern int widget_viewer_set_pinup(widget_h handle, int flag, widget_ret_cb cb, void *data); - -/** - * @internal - * @brief Checks the PIN-UP status of the given handle. - * @since_tizen 2.3.1 - * @param[in] handle Handle of a widget instance - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER Invalid parameters - * @retval 1 Box is pinned up - * @retval 0 Box is not pinned up - * @see widget_set_pinup() - */ -extern int widget_viewer_is_pinned_up(widget_h handle); - -/** - * @internal - * @brief Checks the availability of the PIN-UP feature for the given handle. - * @since_tizen 2.3.1 - * @param[in] handle Handle of a widget instance - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER Invalid argument - * @retval 1 If the box support Pinup feature - * @retval 0 If the box does not support the Pinup feature - * @see widget_is_pinned_up() - * @see widget_set_pinup() - */ -extern int widget_viewer_has_pinup(widget_h handle); - -/** - * @internal - * @brief Checks the existence of Glance Bar for the given handle. - * @since_tizen 2.3.1 - * @param[in] handle Handle of a widget instance - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER Invalid argument - * @retval 1 If the box support the Glance Bar - * @retval 0 If the box has no Glance Bar - */ -extern int widget_viewer_has_glance_bar(widget_h handle); - -/** - * @internal - * @brief Creates Glance Bar of the given handle with the relative position from widget. - * @remarks - * This is an ASYNCHRONOUS API. - * @since_tizen 2.3.1 - * @param[in] handle Handle of a widget instance - * @param[in] x 0.0 ~ 1.0 - * @param[in] y 0.0 ~ 1.0 - * @param[in] cb Result callback - * @param[in] data Callback data - * @privlevel platform - * @privilege %http://tizen.org/privilege/widget.viewer - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_STATUS_ERROR_NONE Successfully done - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER Invalid argument - * @retval #WIDGET_STATUS_ERROR_BUSY Previous operation is not finished yet - * @retval #WIDGET_STATUS_ERROR_FAULT Unrecoverable error occurred - * @see widget_create_glance_bar() - * @see widget_destroy_glance_bar() - * @see widget_move_glance_bar() - */ -extern int widget_viewer_create_glance_bar(widget_h handle, double x, double y, widget_ret_cb cb, void *data); - -/** - * @internal - * @brief Updates a position of the given Glance Bar. - * @since_tizen 2.3.1 - * @param[in] handle Handle of a widget instance - * @param[in] x 0.0 ~ 1.0, 0.0 indicates the coordinate X of left of widget - * @param[in] y 0.0 ~ 1.0, 0.0 indicates the coordinate Y of top of widget - * @privlevel platform - * @privilege %http://tizen.org/privilege/widget.viewer - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_STATUS_ERROR_NONE If sending a request for updating position of the Glance Bar has been done successfully - * @retval #WIDGET_STATUS_ERROR_FAULT Unrecoverable error occurred - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER Invalid argument - */ -extern int widget_viewer_move_glance_bar(widget_h handle, double x, double y); - -/** - * @internal - * @brief Destroys the Glance Bar of the given handle if it is created. - * @remarks - * This is an ASYNCHRONOUS API. - * @since_tizen 2.3.1 - * @param[in] handle Handle of a widget instance - * @param[in] cb Callback function - * @param[in] data Callback data - * @privlevel platform - * @privilege %http://tizen.org/privilege/widget.viewer - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER Invalid argument - * @retval #WIDGET_STATUS_ERROR_FAULT Unrecoverable error occurred - * @retval #WIDGET_STATUS_ERROR_NONE Successfully done - * @see widget_ret_cb - */ -extern int widget_viewer_destroy_glance_bar(widget_h handle, widget_ret_cb cb, void *data); - -/** - * @internal - * @brief Checks the create status of the given widget handle. - * @since_tizen 2.3.1 - * @param[in] handle Handle of a widget instance - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER Invalid argument - * @retval 0 Glance Bar is not created - * @retval 1 Glance Bar is created - */ -extern int widget_viewer_glance_bar_is_created(widget_h handle); - -/** - * @internal - * @brief Sets a function table for parsing the text content of a widget. - * @since_tizen 2.3.1 - * @param[in] handle Handle of a widget instance - * @param[in] gbar 1 for Glance Bar or 0 - * @param[in] ops - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_STATUS_ERROR_NONE Successfully done - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER Invalid argument - * @see widget_set_gbar_text_handler() - */ -extern int widget_viewer_set_text_handler(widget_h handle, int gbar, widget_script_operator_s ops); - -/** - * @internal - * @brief Emits a text signal to the given widget only if it is a text type. - * @since_tizen 2.3.1 - * @remarks - * This is an ASYNCHRONOUS API. - * This function is Asynchronous, so you will get result of add requst from @a cb, if you failed to send request to create a new widget, - * This function will returns proper error code - * @param[in] handle Handle of a widget instance - * @param[in] signal_name Emission string - * @param[in] source Source string - * @param[in] sx Start X - * @param[in] sy Start Y - * @param[in] ex End X - * @param[in] ey End Y - * @param[in] cb Result callback - * @param[in] data Callback data - * @privlevel platform - * @privilege %http://tizen.org/privilege/widget.viewer - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER Invalid parameters - * @retval #WIDGET_STATUS_ERROR_FAULT Unrecoverable error occurred - * @retval #WIDGET_STATUS_ERROR_NONE Successfully emitted - * @see widget_ret_cb - */ -extern int widget_viewer_emit_text_signal(widget_h handle, widget_text_signal_s event_info, widget_ret_cb cb, void *data); - -/** - * @internal - * @brief Sets a private data pointer to carry it using the given handle. - * @since_tizen 2.3.1 - * @param[in] handle Handle of a widget instance - * @param[in] data Data pointer - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_STATUS_ERROR_NONE Successfully registered - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER Invalid argument - * @see widget_data() - */ -extern int widget_viewer_set_data(widget_h handle, void *data); - -/** - * @internal - * @brief Gets a private data pointer which is carried by a given handle. - * @since_tizen 2.3.1 - * @param[in] handle Handle of a widget instance - * @retval data Data pointer - * @retval @c NULL If there is no data - * @see widget_set_data() - */ -extern void *widget_viewer_get_data(widget_h handle); - -/** - * @internal - * @brief Subscribes an event for widgetes only in a given cluster and sub-cluster. - * @details If you wrote a view-only client, - * you can receive the event of specific widgetes which belong to a given cluster/category. - * But you cannot modify their attributes (such as size, ...). - * @since_tizen 2.3.1 - * @param[in] cluster Cluster ("*" can be used for subscribe all cluster's widgetes event; If you use the "*", value in the category will be ignored) - * @param[in] category Category ("*" can be used for subscribe widgetes events of all category(sub-cluster) in a given "cluster") - * @privlevel platform - * @privilege %http://tizen.org/privilege/widget.viewer - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_STATUS_ERROR_FAULT Unrecoverable error occurred - * @retval #WIDGET_STATUS_ERROR_NONE Successfully requested - * @see widget_unsubscribe_group() - */ -extern int widget_viewer_subscribe_group(const char *cluster, const char *sub_cluster); - -/** - * @internal - * @brief Unsubscribes an event for the widgetes, but you will receive already added widgetes events. - * @since_tizen 2.3.1 - * @param[in] cluster Cluster("*" can be used for subscribe all cluster's widgetes event; If you use the "*", value in the category will be ignored) - * @param[in] category Category ("*" can be used for subscribe all sub-cluster's widgetes event in a given "cluster") - * @privlevel platform - * @privilege %http://tizen.org/privilege/widget.viewer - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_STATUS_ERROR_FAULT Unrecoverable error occurred - * @retval #WIDGET_STATUS_ERROR_NONE Successfully requested - * @see widget_subscribe_group() - */ -extern int widget_viewer_unsubscribe_group(const char *cluster, const char *sub_cluster); - -/** - * @internal - * @brief Subscribe events of widgetes which is categorized by given "category" string. - * "category" is written in the XML file of each widget manifest file. - * After subscribe the category, the master will send created event for all created widgetes, - * Also it will notify client when a new widget is created. - * @since_tizen 2.3.1 - * @param[in] category Category name - * @privlevel platform - * @privilege %http://developer.samsung.com/tizen/privilege/widget.viewer - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_STATUS_ERROR_FAULT Unrecoverable error occurred - * @retval #WIDGET_STATUS_ERROR_NONE Successfully requested - * @see widget_unsubscribe_category() - */ -extern int widget_viewer_subscribe_category(const char *category); - -/** - * @internal - * @brief Unsubscribe events of widgetes. - * @since_tizen 2.3.1 - * @param[in] category Category name - * @privlevel platform - * @privilege %http://developer.samsung.com/tizen/privilege/widget.viewer - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_STATUS_ERROR_FAULT Unrecoverable error occurred - * @retval #WIDGET_STATUS_ERROR_NONE Successfully requested - * @see widget_subscribe_category() - */ -extern int widget_viewer_unsubscribe_category(const char *category); - -/** - * @internal - * @brief Refreshes the group (cluster/sub-cluser (aka. category)). - * @details This function will trigger the update of all widgetes in a given cluster/category group. - * @since_tizen 2.3.1 - * @remarks Basically, a default widget system doesn't use the cluster/category concept. - * But you can use it. So if you decide to use it, then you can trigger the update of all widgetes in the given group. - * @param[in] cluster Cluster ID - * @param[in] category Sub-cluster ID - * @param[in] force 1 if the boxes should be updated even if they are paused - * @privlevel platform - * @privilege %http://tizen.org/privilege/widget.viewer - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER Invalid argument - * @retval #WIDGET_STATUS_ERROR_FAULT Unrecoverable error occurred - * @retval #WIDGET_STATUS_ERROR_NONE Successfully requested - * @see widget_refresh() - */ -extern int widget_viewer_refresh_group(const char *cluster, const char *category, int force); - -/** - * @brief Refreshes a widget. - * @since_tizen 2.3.1 - * @privlevel public - * @privilege %http://tizen.org/privilege/widget.viewer - * @param[in] handle Handle of a widget instance - * @param[in] force 1 if the box should be updated even if it is paused - * @privlevel platform - * @privilege %http://tizen.org/privilege/widget.viewer - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER Invalid argument - * @retval #WIDGET_STATUS_ERROR_FAULT Unrecoverable error occurred - * @retval #WIDGET_STATUS_ERROR_NONE Successfully requested - * @see widget_refresh_group() - */ -extern int widget_viewer_refresh(widget_h handle, int force); - -/** - * @brief Gets Resource id of a widget content. - * @details This function doesn't guarantee the life-cycle of the resource id. - * If the service provider destroyed the resource id, you will not know about it. - * So you should validate it before accessing it. - * @since_tizen 2.3.1 - * * @param[in] handle Handle of a widget instance - * @param[in] gbar 1 for Glance Bar or 0 - * @param[out] resouce_id result resource id of the widget - * @return #WIDGET_STATUS_ERROR_NONE on success, - * otherwise an error code (see #WIDGET_STATUS_ERROR_XXX) on failure - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER Invalid argument - * @retval #WIDGET_STATUS_ERROR_FAULT Unrecoverable error occurred - * @see widget_get_resource_id() - */ -extern int widget_viewer_get_resource_id(const widget_h handle, int gbar, unsigned int *resouce_id); - -/** - * @internal - * @brief Gets the Resource Id of a widget. - * @details Even if a render process releases the Resource Id, the Resource Id will be kept before being released by widget_release_resource_id. - * You should release the resource id manually. - * @remarks - * This is an ASYNCHRONOUS API. - * @since_tizen 2.3.1 - * @param[in] handle Handle of a widget instance - * @param[in] gbar 1 for Glance Bar or 0 - * @param[in] cb Callback function which will be called with result of acquiring widget resource id - * @param[in] data Callback data - * @privlevel platform - * @privilege %http://tizen.org/privilege/widget.viewer - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER Invalid argument - * @retval #WIDGET_STATUS_ERROR_FAULT Unrecoverable error occurred - * @retval #WIDGET_STATUS_ERROR_NONE Successfully requested - * @pre widget service system should support the ResourceId type buffer. - * The widget should be designed to use the buffer (or script). - * @see widget_release_resource_id() - * @see widget_ret_cb - */ -extern int widget_viewer_acquire_resource_id(widget_h handle, int gbar, widget_ret_cb cb, void *data); - -/** - * @internal - * @brief Get the Resource Id of a widget for Extra buffer - * @details Even if a render process(provider) released the Resource Id, it will be kept while release it by viewer.\n - * This will prevent from unexpected resource releasing for viewer.\n - * You should release this using widget_release_resource_id() - * @remarks - * This is an ASYNCHRONOUS API. - * @since_tizen 2.3.1 - * @param[in] handle Handle of a widget instance - * @param[in] gbar 1 for Glance Bar or 0 - * @param[in] idx Index of extra buffer, it is limited to widget configuration - * @param[in] cb Callback function which will be called with result of acquiring widget resource id - * @param[in] data Callback data - * @privlevel platform - * @privilege %http://tizen.org/privilege/widget.viewer - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER Invalid argument - * @retval #WIDGET_STATUS_ERROR_FAULT Unrecoverable error occurred - * @retval #WIDGET_STATUS_ERROR_NONE Successfully requested - * @pre widget service system should support the resource id type buffer. - * The widget should be designed to use the buffer (or script) - * @see widget_release_resource_id() - * @see widget_ret_cb - */ -extern int widget_viewer_acquire_extra_resource_id(widget_h handle, int gbar, int idx, widget_ret_cb cb, void *data); - -/** - * @brief Releases the Resource Id of a widget. - * @details After a client gets a new Resource Id or does not need to keep the current Resource Id anymore, use this function to release it. - * If there is no user for a given Resource Id, the Resource Id will be destroyed. - * @since_tizen 2.3.1 - * @privlevel public - * @privilege %http://tizen.org/privilege/widget.viewer - * @param[in] handle Handle of a widget instance - * @param[in] gbar 1 for Glance Bar or 0 - * @param[in] resource_id Resource Id of given widget handle - * @privlevel platform - * @privilege %http://tizen.org/privilege/widget.viewer - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER Invalid argument - * @retval #WIDGET_STATUS_ERROR_FAULT Unrecoverable error occurred - * @retval #WIDGET_STATUS_ERROR_NONE Successfully done - * @pre The Resource Id should be acquired by widget_acquire_resource_id - * @see widget_acquire_resource_id() - */ -extern int widget_viewer_release_resource_id(widget_h handle, int gbar, unsigned int resource_id); - -/** - * @brief Updates a visible state of the widget. - * @since_tizen 2.3.1 - * @privlevel public - * @privilege %http://tizen.org/privilege/widget.viewer - * @param[in] handle Handle of a widget instance - * @param[in] state Configure the current visible state of a widget - * @privlevel platform - * @privilege %http://tizen.org/privilege/widget.viewer - * @return #WIDGET_STATUS_ERROR_NONE on success, - * otherwise an error code (see #WIDGET_STATUS_ERROR_XXX) on failure - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER Invalid argument - * @retval #WIDGET_STATUS_ERROR_PERMISSION_DENIED Permission denied - * @retval #WIDGET_STATUS_ERROR_ALREADY Input state is same to existing state - * @retval #WIDGET_STATUS_ERROR_FAULT Unrecoverable error occurred - */ -extern int widget_viewer_set_visibility(widget_h handle, widget_visible_state_e state); - -/** - * @internal - * @brief Gets the current visible state of a widget. - * @remarks - * If this returns WIDGET_VISIBLE_ERROR, you can get the reason of failure using get_last_result() - * @since_tizen 2.3.1 - * @param[in] handle Handle of a widget instance - * @return widget_visible_state - * @retval #WIDGET_SHOW widget is shown (Default state) - * @retval #WIDGET_HIDE widget is hidden, Update timer is not frozen (but a user cannot receive any updated events; a user should refresh(reload) the content of a widget when a user make this show again) - * @retval #WIDGET_HIDE_WITH_PAUSE widget is hidden, it will pause the update timer, but if a widget updates its contents, update event will occur - * @retval #WIDGET_VISIBLE_ERROR To enlarge the size of this enumeration type - */ -extern widget_visible_state_e widget_viewer_get_visibility(widget_h handle); - -/** - * @internal - * @brief Sets an update mode of the current widget. - * @details If you set 1 for active update mode, you should get a buffer without updated event from provider. - * But if it is passive mode, you have to update content of a box when you get updated events. - * Default is Passive mode. - * @since_tizen 2.3.1 - * @remarks - * This is an ASYNCHRONOUS API. - * This function is Asynchronous, so you will get result of add requst from @a cb, if you failed to send request to create a new widget, - * This function will returns proper error code - * @param[in] handle Handle of a widget instance - * @param[in] active_update 1 means active update, 0 means passive update (default) - * @param[in] cb Result callback function - * @param[in] data Callback data - * @privlevel platform - * @privilege %http://tizen.org/privilege/widget.viewer - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER Invalid argument - * @retval #WIDGET_STATUS_ERROR_BUSY - * @retval #WIDGET_STATUS_ERROR_PERMISSION_DENIED - * @retval #WIDGET_STATUS_ERROR_ALREADY - * @retval #WIDGET_STATUS_ERROR_FAULT Unrecoverable error occurred - * @retval #WIDGET_STATUS_ERROR_NONE Successfully done - * @see widget_ret_cb - */ -extern int widget_viewer_set_update_mode(widget_h handle, int active_update, widget_ret_cb cb, void *data); - -/** - * @internal - * @brief Checks the active update mode of the given widget. - * @remarks - * If this returns negative value, you can get the reason of failure using get_last_result() - * @since_tizen 2.3.1 - * @param[in] handle Handle of a widget instance - * @return 0 on success, otherwise a negative error value - * @retval 0 If passive mode - * @retval 1 If active mode or error code - */ -extern int widget_viewer_is_active_update(widget_h handle); - -/** - * @internal - * @brief Syncs manually - * @since_tizen 2.3.1 - * @param[in] handle Handle of a widget instance - * @param[in] gbar 1 for Glance Bar or 0 - * @privlevel platform - * @privilege %http://tizen.org/privilege/widget.viewer - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_STATUS_ERROR_NONE If success - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER Invalid handle - * @see widget_set_manual_sync() - * @see widget_manual_sync() - */ -extern int widget_viewer_sync_buffer(widget_h handle, int gbar); - -/** - * @internal - * @brief Getting the damaged region info - * @since_tizen 2.3.1 - * @param[in] handle Handle of a widget instance - * @param[in] gbar 1 for Glance Bar or 0 - * @param[out] region Readonly information for damaged area - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_STATUS_ERROR_NONE if success - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER Invalid handle - */ -extern int widget_viewer_get_damaged_region(widget_h handle, int gbar, const widget_damage_region_s *region); - -/** - * @internal - * @brief Gets an alternative icon of the given widget instance. - * @details If the box should be represented as a shortcut icon, this function will get the alternative icon. - * @remarks - * If this returns @c NULL, you can get the reason of failure using get_last_result() - * @since_tizen 2.3.1 - * @param[in] handle Handle of a widget instance - * @return const char * - * @retval address Absolute path of an alternative icon file - * @retval @c NULL widget has no alternative icon file - * @see widget_alt_name() - */ -extern const char *widget_viewer_get_alternative_icon(widget_h handle); - -/** - * @internal - * @brief Gets an alternative name of the given widget instance. - * @details If the box should be represented as a shortcut name, this function will get the alternative name. - * @remarks - * If this returns @c NULL, you can get the reason of failure using get_last_result() - * @since_tizen 2.3.1 - * @param[in] handle Handle of a widget instance - * @return const char * - * @retval name Alternative name of a widget - * @retval @c NULL widget has no alternative name - * @see widget_alt_icon() - */ -extern const char *widget_viewer_get_alternative_name(widget_h handle); - -/** - * @internal - * @brief Gets a lock for a frame buffer. - * @details This function should be used to prevent from rendering to the frame buffer while reading it. - * And the locking area should be short and must be released ASAP, or the render thread will be hanged. - * @since_tizen 2.3.1 - * @param[in] handle Handle of a widget instance - * @param[in] gbar 1 for Glance Bar or 0 - * @privlevel platform - * @privilege %http://tizen.org/privilege/widget.viewer - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_STATUS_ERROR_FAULT Unrecoverable error occurred - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER Invalid argument - * @retval #WIDGET_STATUS_ERROR_NONE Successfully done - * @see widget_release_buffer_lock() - */ -extern int widget_viewer_acquire_buffer_lock(widget_h handle, int gbar); - -/** - * @internal - * @brief Releases a lock of the frame buffer. - * @details This function should be called ASAP after acquiring a lock of FB, or the render process will be blocked. - * @since_tizen 2.3.1 - * @param[in] handle Handle of a widget instance - * @param[in] gbar 1 for Glance Bar or 0 - * @privlevel platform - * @privilege %http://tizen.org/privilege/widget.viewer - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_STATUS_ERROR_FAULT Unrecoverable error occurred - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER Invalid argument - * @retval #WIDGET_STATUS_ERROR_NONE Successfully done - * @see widget_acquire_buffer_lock() - */ -extern int widget_viewer_release_buffer_lock(widget_h handle, int gbar); - -/** - * @brief Sets options for controlling a widget sub-system. - * @details - * #WIDGET_OPTION_FRAME_DROP_FOR_RESIZE - * While resizing the box, viewer doesn't want to know the updated frames of an old size content anymore. - * In that case, turn this on, the provider will not send the updated event to the viewer about an old content. - * So the viewer can reduce its burden to update unnecessary frames. - * #WIDGET_OPTION_MANUAL_SYNC - * If you don't want to update frames automatically, or you want only reload the frames by your hands, (manually) - * Turn this on. - * After turnning it on, you should sync it using widget_sync_buffer(). - * #WIDGET_OPTION_SHARED_CONTENT - * If this option is turnned on, even though you create a new widget, - * if there are already added same instances that have same contents, the instance will not be created again. - * Instead of creating a new instance, a viewer will provide an old instance with a new handle. - * @since_tizen 2.3.1 - * * @param[in] option Option which will be affected by this call - * @param[in] state New value for given option - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER Unknown option - * @retval #WIDGET_STATUS_ERROR_FAULT Failed to change the state of option - * @retval #WIDGET_STATUS_ERROR_NONE Successfully changed - * @see widget_get_option() - * @see widget_sync_buffer() - */ -extern int widget_viewer_set_option(widget_option_type_e option, int state); - -/** - * @internal - * @brief Gets options of a widget sub-system. - * @remarks - * If this returns negative value, you can get the reason of failure using get_last_result() - * @since_tizen 2.3.1 - * @param[in] option Type of option - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER Invalid option - * @retval #WIDGET_STATUS_ERROR_FAULT Failed to get option - * @retval >=0 Value of given option (must be >=0) - * @see widget_set_option() - */ -extern int widget_viewer_get_option(widget_option_type_e option); - -/** - * @internal - * @brief Set a handle for launching an app by auto-launch feature - * @details If a user clicks a box, which box enabled auto-launch option, the launcher_handler will be called. - * From that callback, you should launch an app using given ui-app id. - * @since_tizen 2.3.1 - * @param[in] launch_handler Handle for launching an app manually - * @param[in] data Callback data which will be given a data for launch_handler - * @return #WIDGET_STATUS_ERROR_NONE on success, - * otherwise an error code (see #WIDGET_STATUS_ERROR_XXX) on failure - * @retval #WIDGET_STATUS_ERROR_NONE Succeed to set new handle. there is no other cases - */ -extern int widget_viewer_set_auto_launch_handler(widget_auto_launch_handler_cb cb, void *data); - -/** - * @internal - * @brief Get the last extra buffer index and its id. - * @details - * If there is an event of #WIDGET_EVENT_WIDGET_EXTRA_BUFFER_CREATED or #WIDGET_EVENT_GBAR_EXTRA_BUFFER_CREATED, - * #WIDGET_EVENT_WIDGET_EXTRA_BUFFER_DESTROYED or #WIDGET_EVENT_GBAR_EXTRA_BUFFER_DESTROYED - * you can use this to get the last created buffer info - * @since_tizen 2.3.1 - * @param[in] handle widget handle - * @param[in] gbar 1 if you want get the glance bar's info or 0 - * @param[out] idx Index of buffer - * @param[out] resource_id Resource Id - * @return status - * @retval #WIDGET_STATUS_ERROR_NONE Successfully get - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER Handle is not valid - * @retval #WIDGET_STATUS_ERROR_NOT_EXIST There is no extra buffer - */ -extern int widget_viewer_get_affected_extra_buffer(widget_h handle, int gbar, int *idx, unsigned int *resource_id); - -extern int widget_viewer_get_instance_id(widget_h handle, char **instance_id); - -extern int widget_viewer_notify_orientation_of_viewer(int orientation); - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/widget_viewer/include/widget_viewer_internal.h b/widget_viewer/include/widget_viewer_internal.h deleted file mode 100644 index 379cdf7..0000000 --- a/widget_viewer/include/widget_viewer_internal.h +++ /dev/null @@ -1,278 +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 __WIDGET_VIEWER_INTERNAL_H -#define __WIDGET_VIEWER_INTERNAL_H - -#include "widget_viewer.h" -#include "widget_buffer.h" - -struct cb_info { - widget_ret_cb cb; - void *data; -}; - -extern void _widget_invoke_event_handler(struct widget *handler, widget_event_type_e event); -extern void _widget_invoke_fault_handler(widget_fault_type_e type, const char *pkgname, const char *filename, const char *function); - -extern struct widget_common *_widget_find_common_handle(const char *pkgname, const char *filename); -extern struct widget *_widget_new_widget(const char *pkgname, const char *id, double timestamp, const char *cluster, const char *category); -extern struct widget_common *_widget_find_common_handle_by_timestamp(double timestamp); - -extern int _widget_set_group(struct widget_common *common, const char *cluster, const char *category); -extern void _widget_set_size(struct widget_common *common, int w, int h); -extern void _widget_set_gbarsize(struct widget_common *common, int w, int h); -extern void _widget_set_default_gbarsize(struct widget_common *common, int w, int h); -extern int _widget_set_content(struct widget_common *common, const char *content); -extern int _widget_set_title(struct widget_common *handler, const char *title); -extern void _widget_set_auto_launch(struct widget_common *handler, const char *auto_launch); -extern void _widget_set_id(struct widget_common *handler, const char *id); -extern void _widget_set_size_list(struct widget_common *handler, int size_list); -extern void _widget_set_priority(struct widget_common *handler, double priority); -extern int _widget_set_widget_fb(struct widget_common *handler, const char *filename); -extern int _widget_set_gbar_fb(struct widget_common *handler, const char *filename); -extern struct fb_info *_widget_get_gbar_fb(struct widget_common *handler); -extern struct fb_info *_widget_get_widget_fb(struct widget_common *handler); -extern void _widget_set_user(struct widget_common *handler, int user); -extern void _widget_set_pinup(struct widget_common *handler, int pinup); -extern void _widget_set_text_widget(struct widget_common *handler); -extern void _widget_set_text_gbar(struct widget_common *handler); -extern int _widget_text_widget(struct widget_common *handler); -extern int _widget_text_gbar(struct widget_common *handler); -extern void _widget_set_period(struct widget_common *handler, double period); -extern void _widget_set_update_mode(struct widget_common *handler, int active_mode); -extern void _widget_set_filename(struct widget_common *handler, const char *filename); -extern void _widget_unlink_filename(struct widget_common *common); -extern void _widget_set_alt_icon(struct widget_common *handler, const char *icon); -extern void _widget_set_alt_name(struct widget_common *handle, const char *name); -extern int _widget_destroy_common_handle(struct widget_common *common); -extern struct widget_common *_widget_create_common_handle(struct widget *handle, const char *pkgname, const char *cluster, const char *category); -extern int _widget_sync_gbar_fb(struct widget_common *common); -extern int _widget_sync_widget_fb(struct widget_common *common); -extern int _widget_common_unref(struct widget_common *common, struct widget *handle); -extern int _widget_common_ref(struct widget_common *common, struct widget *handle); -extern struct widget_common *_widget_find_sharable_common_handle(const char *pkgname, const char *content, int w, int h, const char *cluster, const char *category); -extern struct widget *_widget_find_widget_in_show(struct widget_common *common); -extern struct widget *_widget_get_widget_nth(struct widget_common *common, int nth); -extern void *_widget_remove_event_handler(widget_event_handler_cb widget_cb); -extern int _widget_add_event_handler(widget_event_handler_cb widget_cb, void *data); -extern int _widget_add_fault_handler(widget_fault_handler_cb widget_cb, void *data); -extern void *_widget_remove_fault_handler(widget_fault_handler_cb widget_cb); -extern struct cb_info *_widget_create_cb_info(widget_ret_cb cb, void *data); -extern void _widget_destroy_cb_info(struct cb_info *info); - -extern struct widget *_widget_ref(struct widget *handler); -extern struct widget *_widget_unref(struct widget *handler, int destroy_common); -extern int _widget_send_delete(struct widget *handler, int type, widget_ret_cb cb, void *data); -extern int _widget_delete_all(void); - -typedef enum widget_state { - WIDGET_STATE_CREATE = 0xBEEFbeef, - WIDGET_STATE_DELETE = 0xDEADdead, /* Delete only for this client */ - WIDGET_STATE_DESTROYED = 0x00DEAD00 -} widget_state_e; - -struct widget_common { - widget_state_e state; - - struct dlist *widget_list; - int refcnt; - - char *cluster; - char *category; - - char *pkgname; - char *id; - - char *content; - char *title; - char *filename; - - double timestamp; - - struct alt_info { - char *icon; - char *name; - } alt; - - widget_delete_type_e delete_type; - - int is_user; - int is_gbar_created; - int is_pinned_up; - int is_active_update; - widget_visible_state_e visible; - - struct { - widget_widget_type_e type; - struct fb_info *fb; - - int size_list; - - int width; - int height; - double priority; - - char *auto_launch; - double period; - int pinup_supported; - bool mouse_event; - - /* For the filtering event */ - double x; - double y; - - /* For the extra buffer */ - unsigned int *extra_buffer; - int last_extra_buffer_idx; - - /* Lock */ - widget_lock_info_t lock; - - /* For damaged region */ - struct widget_damage_region last_damage; - } widget; - - struct { - widget_gbar_type_e type; - struct fb_info *fb; - - int width; - int height; - - int default_width; - int default_height; - - /* For the filtering event */ - double x; - double y; - - /* For the extra buffer */ - unsigned int *extra_buffer; - int last_extra_buffer_idx; - - /* Lock */ - widget_lock_info_t lock; - - /* For damaged region */ - struct widget_damage_region last_damage; - } gbar; - - int nr_of_sizes; - - struct requested_flag { - unsigned int created:1; - unsigned int deleted:1; - unsigned int pinup:1; - unsigned int group_changed:1; - unsigned int period_changed:1; - unsigned int size_changed:1; - unsigned int gbar_created:1; - unsigned int gbar_destroyed:1; - unsigned int update_mode:1; - unsigned int access_event:1; - unsigned int key_event:1; - - /*! - * \note - * Reserved - */ - unsigned int reserved:21; - } request; -}; - -struct job_item { - struct widget *handle; - widget_ret_cb cb; - int ret; - void *data; -}; - -struct widget { - widget_state_e state; - - int refcnt; - int paused_updating; - - widget_visible_state_e visible; - struct widget_common *common; - - void *data; - - struct callback_table { - struct widget_script_operators widget_ops; - struct widget_script_operators gbar_ops; - - struct created { - widget_ret_cb cb; - void *data; - } created; - - struct deleted { - widget_ret_cb cb; - void *data; - } deleted; - - struct pinup { - widget_ret_cb cb; - void *data; - } pinup; - - struct group_changed { - widget_ret_cb cb; - void *data; - } group_changed; - - struct period_changed { - widget_ret_cb cb; - void *data; - } period_changed; - - struct size_changed { - widget_ret_cb cb; - void *data; - } size_changed; - - struct gbar_created { - widget_ret_cb cb; - void *data; - } gbar_created; - - struct gbar_destroyed { - widget_ret_cb cb; - void *data; - } gbar_destroyed; - - struct update_mode { - widget_ret_cb cb; - void *data; - } update_mode; - - struct access_event { - widget_ret_cb cb; - void *data; - } access_event; - - struct key_event { - widget_ret_cb cb; - void *data; - } key_event; - } cbs; -}; - -#endif /* __WIDGET_VIEWER_INTERNAL_H */ - -/* End of a file */ diff --git a/widget_viewer/src/client.c b/widget_viewer/src/client.c deleted file mode 100644 index 9609dff..0000000 --- a/widget_viewer/src/client.c +++ /dev/null @@ -1,2360 +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 -#include -#include -#include - -#include -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "debug.h" -#include "client.h" -#include "widget_viewer.h" -#include "widget_viewer_internal.h" -#include "desc_parser.h" -#include "fb.h" -#include "util.h" -#include "master_rpc.h" -#include "conf.h" -#include "file_service.h" -#include "dlist.h" - -int errno; - -#define MAX_DIRECT_ADDR 256 - -static struct info { - int fd; - int direct_fd; - int master_direct_fd; - guint timer_id; - char *client_addr; - char *direct_addr; -} s_info = { - .fd = -1, - .direct_fd = -1, - .master_direct_fd = -1, - .timer_id = 0, - .client_addr = NULL, - .direct_addr = NULL, -}; - -static struct packet *master_fault_package(pid_t pid, int handle, const struct packet *packet) -{ - const char *pkgname; - const char *id; - const char *function; - - if (packet_get(packet, "sss", &pkgname, &id, &function) != 3) { - ErrPrint("Invalid arguments\n"); - return NULL; - } - - DbgPrint("[%s]\n", pkgname); - master_rpc_clear_fault_package(pkgname); - _widget_invoke_fault_handler(WIDGET_FAULT_DEACTIVATED, pkgname, id, function); - return NULL; -} - -static struct packet *master_hold_scroll(pid_t pid, int handle, const struct packet *packet) -{ - struct widget_common *common; - widget_h widget; - const char *pkgname; - const char *id; - int seize; - int ret; - struct dlist *l; - - ret = packet_get(packet, "ssi", &pkgname, &id, &seize); - if (ret != 3) { - ErrPrint("Invalid argument\n"); - goto out; - } - - common = _widget_find_common_handle(pkgname, id); - if (!common) { - ErrPrint("Instance(%s) is not exists\n", id); - goto out; - } - - DbgPrint("HOLD: [%s] seize(%d)\n", id, seize); - seize = seize ? WIDGET_EVENT_HOLD_SCROLL : WIDGET_EVENT_RELEASE_SCROLL; - dlist_foreach(common->widget_list, l, widget) { - _widget_invoke_event_handler(widget, seize); - } - -out: - return NULL; -} - -static struct packet *master_pinup(pid_t pid, int handle, const struct packet *packet) -{ - const char *pkgname; - const char *id; - const char *content; - widget_h handler; - struct dlist *l; - struct dlist *n; - struct widget_common *common; - char *new_content; - int ret; - int status; - int pinup; - - ret = packet_get(packet, "iisss", &status, &pinup, &pkgname, &id, &content); - if (ret != 5) { - ErrPrint("Invalid argument\n"); - goto out; - } - - common = _widget_find_common_handle(pkgname, id); - if (!common) { - ErrPrint("Instance (%s) is not exists\n", id); - goto out; - } - - if (status == (int)WIDGET_ERROR_NONE) { - new_content = strdup(content); - if (new_content) { - free(common->content); - common->content = new_content; - common->is_pinned_up = pinup; - } else { - ErrPrint("Heap: %d\n", errno); - status = WIDGET_ERROR_OUT_OF_MEMORY; - } - } - - common->request.pinup = 0; - - dlist_foreach_safe(common->widget_list, l, n, handler) { - if (handler->cbs.pinup.cb) { - widget_ret_cb cb; - void *cbdata; - - /* Make sure that user can call pinup API in its result callback */ - cb = handler->cbs.pinup.cb; - cbdata = handler->cbs.pinup.data; - - handler->cbs.pinup.cb = NULL; - handler->cbs.pinup.data = NULL; - - cb(handler, status, cbdata); - } else if (status == (int)WIDGET_ERROR_NONE) { - _widget_invoke_event_handler(handler, WIDGET_EVENT_PINUP_CHANGED); - } - } - -out: - return NULL; -} - -static struct packet *master_deleted(pid_t pid, int handle, const struct packet *packet) -{ - const char *pkgname; - const char *id; - double timestamp; - widget_h handler; - struct widget_common *common; - struct dlist *l; - struct dlist *n; - int reason; - - if (packet_get(packet, "ssdi", &pkgname, &id, ×tamp, &reason) != 4) { - ErrPrint("Invalid arguemnt\n"); - goto out; - } - - DbgPrint("[%s]\n", pkgname); - common = _widget_find_common_handle_by_timestamp(timestamp); - if (!common) { - /*! - * \note - * This can be happens only if the user delete a widget - * right after create it before receive created event. - */ - goto out; - } - - /*!< Check validity of this "handler" */ - if (common->state != WIDGET_STATE_CREATE) { - if (common->state != WIDGET_STATE_DELETE) { - /*! - * \note - * This is not possible - */ - ErrPrint("Already deleted handler (%s - %s)\n", pkgname, id); - return NULL; - } - } - - common->request.deleted = 0; - /*! - * We should change the state of "common handler' before handling the callbacks. - * Because if user tries to create a new handle in the callbacks, - * find_sharable_common_handle will returns destroying object. - * Then we will get panic. - * To prevent it, we should change its state first. - */ - common->state = WIDGET_STATE_DELETE; - - dlist_foreach_safe(common->widget_list, l, n, handler) { - if (handler->cbs.created.cb) { - widget_ret_cb cb; - void *cbdata; - /*! - * \note - * - * "if (handler->id == NULL) {" - * - * The instance is not created yet. - * But the master forcely destroy it and send destroyed event to this - * without the created event. - * - * It could be destroyed when a slave has critical error(fault) - * before creating an instance successfully. - */ - if (handler->cbs.created.cb == handler->cbs.deleted.cb) { - if (handler->cbs.created.data != handler->cbs.deleted.data) { - DbgPrint("cb is same but cbdata is different (%s - %s)\n", pkgname, id); - } - - handler->cbs.deleted.cb = NULL; - handler->cbs.deleted.data = NULL; - } - - cb = handler->cbs.created.cb; - cbdata = handler->cbs.created.data; - - handler->cbs.created.cb = NULL; - handler->cbs.created.data = NULL; - - if (reason == (int)WIDGET_ERROR_NONE) { - reason = WIDGET_ERROR_CANCELED; - } - - cb(handler, reason, cbdata); - } else if (common->id) { - if (handler->cbs.deleted.cb) { - widget_ret_cb cb; - void *cbdata; - - cb = handler->cbs.deleted.cb; - cbdata = handler->cbs.deleted.data; - - handler->cbs.deleted.cb = NULL; - handler->cbs.deleted.data = NULL; - - cb(handler, reason, cbdata); - } else { - _widget_invoke_event_handler(handler, WIDGET_EVENT_DELETED); - } - } - - /* Just try to delete it, if a user didn't remove it from the live box list */ - _widget_unref(handler, 1); - } - -out: - return NULL; -} - -static struct packet *master_widget_update_begin(pid_t pid, int handle, const struct packet *packet) -{ - widget_h handler; - struct widget_common *common; - const char *pkgname; - const char *id; - const char *content; - const char *title; - const char *fbfile; - double priority; - int ret; - - ret = packet_get(packet, "ssdsss", &pkgname, &id, &priority, &content, &title, &fbfile); - if (ret != 6) { - ErrPrint("Invalid argument\n"); - goto out; - } - - common = _widget_find_common_handle(pkgname, id); - if (!common) { - ErrPrint("Instance[%s] is not exists\n", id); - goto out; - } - - if (common->state != WIDGET_STATE_CREATE) { - ErrPrint("(%s) is not created\n", id); - goto out; - } - - _widget_set_priority(common, priority); - _widget_set_content(common, content); - _widget_set_title(common, title); - - /*! - * \NOTE - * Width & Height is not changed in this case. - * If the active update is began, the size should not be changed, - * And if the size is changed, the provider should finish the updating first. - * And then begin updating again after change its size. - */ - if (_widget_get_widget_fb(common)) { - (void)_widget_set_widget_fb(common, fbfile); - - ret = _widget_sync_widget_fb(common); - - if (ret != (int)WIDGET_ERROR_NONE) { - ErrPrint("Failed to do sync FB (%s - %s) (%d)\n", pkgname, fbfile, ret); - } else { - struct dlist *l; - dlist_foreach(common->widget_list, l, handler) { - _widget_invoke_event_handler(handler, WIDGET_EVENT_WIDGET_UPDATE_BEGIN); - } - } - } else { - ErrPrint("Invalid request[%s], %s\n", id, fbfile); - } - -out: - return NULL; -} - -static struct packet *master_gbar_update_begin(pid_t pid, int handle, const struct packet *packet) -{ - widget_h handler; - struct widget_common *common; - const char *pkgname; - const char *id; - const char *fbfile; - int ret; - - ret = packet_get(packet, "sss", &pkgname, &id, &fbfile); - if (ret != 2) { - ErrPrint("Invalid argument\n"); - goto out; - } - - common = _widget_find_common_handle(pkgname, id); - if (!common) { - ErrPrint("Instance[%s] is not exists\n", id); - goto out; - } - - if (common->state != WIDGET_STATE_CREATE) { - ErrPrint("[%s] is not created\n", id); - goto out; - } - - if (_widget_get_gbar_fb(common)) { - (void)_widget_set_gbar_fb(common, fbfile); - - ret = _widget_sync_gbar_fb(common); - if (ret != (int)WIDGET_ERROR_NONE) { - ErrPrint("Failed to do sync FB (%s - %s) (%d)\n", pkgname, fbfile, ret); - } else { - struct dlist *l; - dlist_foreach(common->widget_list, l, handler) { - _widget_invoke_event_handler(handler, WIDGET_EVENT_GBAR_UPDATE_BEGIN); - } - } - } else { - ErrPrint("Invalid request[%s], %s\n", id, fbfile); - } - -out: - return NULL; -} - -static struct packet *master_widget_update_end(pid_t pid, int handle, const struct packet *packet) -{ - widget_h handler; - struct widget_common *common; - const char *pkgname; - const char *id; - int ret; - - ret = packet_get(packet, "ss", &pkgname, &id); - if (ret != 2) { - ErrPrint("Invalid argument\n"); - goto out; - } - - common = _widget_find_common_handle(pkgname, id); - if (!common) { - ErrPrint("Instance[%s] is not exists\n", id); - goto out; - } - - if (common->state != WIDGET_STATE_CREATE) { - ErrPrint("[%s] is not created\n", id); - goto out; - } - - if (_widget_get_widget_fb(common)) { - struct dlist *l; - dlist_foreach(common->widget_list, l, handler) { - _widget_invoke_event_handler(handler, WIDGET_EVENT_WIDGET_UPDATE_END); - } - } else { - ErrPrint("Invalid request[%s]\n", id); - } - -out: - return NULL; -} - -static struct packet *master_key_status(pid_t pid, int handle, const struct packet *packet) -{ - widget_h handler; - struct widget_common *common; - struct dlist *l; - const char *pkgname; - const char *id; - int ret; - int status; - - ret = packet_get(packet, "ssi", &pkgname, &id, &status); - if (ret != 3) { - ErrPrint("Invalid argument\n"); - goto out; - } - - common = _widget_find_common_handle(pkgname, id); - if (!common) { - ErrPrint("Instance[%s] is not exists\n", id); - goto out; - } - - if (common->state != WIDGET_STATE_CREATE) { - ErrPrint("[%s] is not created\n", id); - goto out; - } - - common->request.key_event = 0; - dlist_foreach(common->widget_list, l, handler) { - if (handler->cbs.key_event.cb) { - widget_ret_cb cb; - void *cbdata; - - cb = handler->cbs.key_event.cb; - cbdata = handler->cbs.key_event.data; - - handler->cbs.key_event.cb = NULL; - handler->cbs.key_event.data = NULL; - - cb(handler, status, cbdata); - } else { - ErrPrint("Invalid event[%s]\n", id); - } - } - -out: - return NULL; -} - -static struct packet *master_request_close_gbar(pid_t pid, int handle, const struct packet *packet) -{ - widget_h handler; - struct widget_common *common; - struct dlist *l; - const char *pkgname; - const char *id; - int ret; - int reason; - - ret = packet_get(packet, "ssi", &pkgname, &id, &reason); - if (ret != 3) { - ErrPrint("Invalid argument\n"); - goto out; - } - - common = _widget_find_common_handle(pkgname, id); - if (!common) { - ErrPrint("Instance[%s] is not exists\n", id); - goto out; - } - - if (common->state != WIDGET_STATE_CREATE) { - ErrPrint("[%s] is not created\n", id); - goto out; - } - - if (!common->is_gbar_created) { - DbgPrint("GBAR is not created, closing what?(%s)\n", id); - goto out; - } - - DbgPrint("Reason: %d\n", reason); - - dlist_foreach(common->widget_list, l, handler) { - _widget_invoke_event_handler(handler, WIDGET_EVENT_REQUEST_CLOSE_GBAR); - } -out: - return NULL; -} - -static struct packet *master_access_status(pid_t pid, int handle, const struct packet *packet) -{ - widget_h handler; - struct widget_common *common; - struct dlist *l; - const char *pkgname; - const char *id; - int ret; - int status; - - ret = packet_get(packet, "ssi", &pkgname, &id, &status); - if (ret != 3) { - ErrPrint("Invalid argument\n"); - goto out; - } - - common = _widget_find_common_handle(pkgname, id); - if (!common) { - ErrPrint("Instance[%s] is not exists\n", id); - goto out; - } - - if (common->state != WIDGET_STATE_CREATE) { - ErrPrint("[%s] is not created\n", id); - goto out; - } - - common->request.access_event = 0; - dlist_foreach(common->widget_list, l, handler) { - if (handler->cbs.access_event.cb) { - widget_ret_cb cb; - void *cbdata; - - cb = handler->cbs.access_event.cb; - cbdata = handler->cbs.access_event.data; - - handler->cbs.access_event.cb = NULL; - handler->cbs.access_event.data = NULL; - - cb(handler, status, cbdata); - } - } -out: - return NULL; -} - -static struct packet *master_gbar_update_end(pid_t pid, int handle, const struct packet *packet) -{ - widget_h handler; - struct widget_common *common; - const char *pkgname; - const char *id; - int ret; - - ret = packet_get(packet, "ss", &pkgname, &id); - if (ret != 2) { - ErrPrint("Invalid argument\n"); - goto out; - } - - common = _widget_find_common_handle(pkgname, id); - if (!common) { - ErrPrint("Instance[%s] is not exists\n", id); - goto out; - } - - if (common->state != WIDGET_STATE_CREATE) { - ErrPrint("[%s] is not created\n", id); - goto out; - } - - if (_widget_get_widget_fb(common)) { - struct dlist *l; - - dlist_foreach(common->widget_list, l, handler) { - _widget_invoke_event_handler(handler, WIDGET_EVENT_GBAR_UPDATE_END); - } - } else { - ErrPrint("Invalid request[%s]", id); - } - -out: - return NULL; -} - -static struct packet *master_extra_info(pid_t pid, int handle, const struct packet *packet) -{ - const char *pkgname; - const char *id; - const char *content; - const char *title; - const char *icon; - const char *name; - double priority; - int ret; - widget_h handler; - struct widget_common *common; - struct dlist *l; - struct dlist *n; - - ret = packet_get(packet, "ssssssd", &pkgname, &id, - &content, &title, - &icon, &name, - &priority); - if (ret != 7) { - ErrPrint("Invalid parameters\n"); - goto out; - } - - common = _widget_find_common_handle(pkgname, id); - if (!common) { - ErrPrint("instance(%s) is not exists\n", id); - goto out; - } - - if (common->state != WIDGET_STATE_CREATE) { - /*! - * \note - * Already deleted by the user. - * Don't try to notice anything with this, Just ignore all events - * Beacuse the user doesn't wants know about this anymore - */ - ErrPrint("(%s) is not exists, but updated\n", id); - goto out; - } - - _widget_set_priority(common, priority); - _widget_set_content(common, content); - _widget_set_title(common, title); - _widget_set_alt_icon(common, icon); - _widget_set_alt_name(common, name); - - dlist_foreach_safe(common->widget_list, l, n, handler) { - _widget_invoke_event_handler(handler, WIDGET_EVENT_EXTRA_INFO_UPDATED); - } -out: - return NULL; -} - -static struct packet *master_extra_updated(pid_t pid, int handle, const struct packet *packet) -{ - const char *pkgname; - const char *id; - widget_h handler; - struct widget_common *common; - int ret; - int x; - int y; - int w; - int h; - int is_gbar; - int event_type; - int idx; - - ret = packet_get(packet, "ssiiiiii", &pkgname, &id, &is_gbar, &idx, &x, &y, &w, &h); - if (ret != 8) { - ErrPrint("Invalid argument\n"); - goto out; - } - - common = _widget_find_common_handle(pkgname, id); - if (!common) { - ErrPrint("instance(%s) is not exists\n", id); - goto out; - } - - if (common->state != WIDGET_STATE_CREATE) { - /*! - * \note - * Already deleted by the user. - * Don't try to notice anything with this, Just ignore all events - * Beacuse the user doesn't wants know about this anymore - */ - ErrPrint("(%s) is not exists, but updated\n", id); - goto out; - } - - if (is_gbar) { - common->gbar.last_damage.x = x; - common->gbar.last_damage.y = y; - common->gbar.last_damage.w = w; - common->gbar.last_damage.h = h; - common->gbar.last_extra_buffer_idx = idx; - - event_type = WIDGET_EVENT_GBAR_EXTRA_UPDATED; - } else { - common->widget.last_damage.x = x; - common->widget.last_damage.y = y; - common->widget.last_damage.w = w; - common->widget.last_damage.h = h; - common->widget.last_extra_buffer_idx = idx; - - event_type = WIDGET_EVENT_WIDGET_EXTRA_UPDATED; - - if (conf_frame_drop_for_resizing() && common->request.size_changed) { - /* Just for skipping the update event callback call, After request to resize buffer, update event will be discarded */ - DbgPrint("Discards obsoloted update event\n"); - ret = WIDGET_ERROR_RESOURCE_BUSY; - } else { - if (!conf_manual_sync()) { - ret = _widget_sync_widget_fb(common); - if (ret != (int)WIDGET_ERROR_NONE) { - ErrPrint("Failed to do sync FB (%s - %s) (%d)\n", pkgname, widget_util_basename(util_uri_to_path(id)), ret); - } - } else { - ret = WIDGET_ERROR_NONE; - } - } - } - - if (!common->request.created && ret == (int)WIDGET_ERROR_NONE) { - struct dlist *l; - struct dlist *n; - - dlist_foreach_safe(common->widget_list, l, n, handler) { - _widget_invoke_event_handler(handler, event_type); - } - } - -out: - return NULL; -} - -static struct packet *master_widget_updated(pid_t pid, int handle, const struct packet *packet) -{ - const char *pkgname; - const char *id; - const char *fbfile; - const char *safe_file; - widget_h handler; - struct widget_common *common; - int ret; - int x; - int y; - int w; - int h; - - ret = packet_get(packet, "ssssiiii", &pkgname, &id, &fbfile, &safe_file, &x, &y, &w, &h); - if (ret != 8) { - ErrPrint("Invalid argument\n"); - goto out; - } - - common = _widget_find_common_handle(pkgname, id); - if (!common) { - ErrPrint("instance(%s) is not exists\n", id); - goto out; - } - - if (common->state != WIDGET_STATE_CREATE) { - /*! - * \note - * Already deleted by the user. - * Don't try to notice anything with this, Just ignore all events - * Beacuse the user doesn't wants know about this anymore - */ - ErrPrint("(%s) is not exists, but updated\n", id); - goto out; - } - - common->widget.last_damage.x = x; - common->widget.last_damage.y = y; - common->widget.last_damage.w = w; - common->widget.last_damage.h = h; - common->widget.last_extra_buffer_idx = WIDGET_PRIMARY_BUFFER; - _widget_set_filename(common, safe_file); - - if (_widget_text_widget(common)) { - const char *common_filename; - - common_filename = common->filename ? common->filename : util_uri_to_path(common->id); - - (void)parse_desc(common, common_filename, 0); - /*! - * \note - * DESC parser will call the "text event callback". - * Don't need to call global event callback in this case. - */ - _widget_unlink_filename(common); - goto out; - } else if (_widget_get_widget_fb(common)) { - /*! - * \todo - * replace this with "flag" instead of "callback address" - */ - if (conf_frame_drop_for_resizing() && common->request.size_changed) { - /* Just for skipping the update event callback call, After request to resize buffer, update event will be discarded */ - DbgPrint("Discards obsoloted update event\n"); - ret = WIDGET_ERROR_RESOURCE_BUSY; - } else { - (void)_widget_set_widget_fb(common, fbfile); - - if (!conf_manual_sync()) { - ret = _widget_sync_widget_fb(common); - if (ret != (int)WIDGET_ERROR_NONE) { - ErrPrint("Failed to do sync FB (%s - %s) (%d)\n", pkgname, widget_util_basename(util_uri_to_path(id)), ret); - } - } else { - ret = WIDGET_ERROR_NONE; - } - } - } else { - ret = WIDGET_ERROR_NONE; - } - - if (ret == (int)WIDGET_ERROR_NONE && !common->request.created) { - struct dlist *l; - struct dlist *n; - - dlist_foreach_safe(common->widget_list, l, n, handler) { - _widget_invoke_event_handler(handler, WIDGET_EVENT_WIDGET_UPDATED); - } - } - _widget_unlink_filename(common); - -out: - return NULL; -} - -static struct packet *master_gbar_created(pid_t pid, int handle, const struct packet *packet) -{ - widget_h handler; - struct widget_common *common; - const char *pkgname; - const char *id; - const char *buf_id; - struct dlist *l; - struct dlist *n; - int width; - int height; - int ret; - int status; - - ret = packet_get(packet, "sssiii", &pkgname, &id, &buf_id, &width, &height, &status); - if (ret != 6) { - ErrPrint("Invalid argument\n"); - goto out; - } - - DbgPrint("[%s]\n", pkgname); - common = _widget_find_common_handle(pkgname, id); - if (!common) { - ErrPrint("Instance(%s) is not exists\n", id); - goto out; - } - - if (common->state != WIDGET_STATE_CREATE) { - ErrPrint("Instance(%s) is not created\n", id); - goto out; - } - - if (!common->request.gbar_created) { - ErrPrint("GBAR create request is canceled\n"); - goto out; - } - - common->is_gbar_created = (status == (int)WIDGET_ERROR_NONE); - common->request.gbar_created = 0; - - if (common->is_gbar_created) { - _widget_set_gbarsize(common, width, height); - if (_widget_text_gbar(common)) { - DbgPrint("Text TYPE does not need to handle this\n"); - } else { - (void)_widget_set_gbar_fb(common, buf_id); - - switch (common->gbar.type) { - case GBAR_TYPE_SCRIPT: - case GBAR_TYPE_BUFFER: - switch (fb_type(_widget_get_gbar_fb(common))) { - case WIDGET_FB_TYPE_FILE: - case WIDGET_FB_TYPE_SHM: - common->gbar.lock = widget_service_create_lock(common->id, WIDGET_TYPE_GBAR, WIDGET_LOCK_READ); - break; - case WIDGET_FB_TYPE_PIXMAP: - case WIDGET_FB_TYPE_ERROR: - default: - break; - } - break; - case GBAR_TYPE_UIFW: - case GBAR_TYPE_TEXT: - default: - break; - } - - ret = _widget_sync_gbar_fb(common); - if (ret < 0) { - ErrPrint("Failed to do sync FB (%s - %s)\n", pkgname, widget_util_basename(util_uri_to_path(id))); - } - } - } - - DbgPrint("PERF_WIDGET\n"); - dlist_foreach_safe(common->widget_list, l, n, handler) { - if (handler->cbs.gbar_created.cb) { - widget_ret_cb cb; - void *cbdata; - - cb = handler->cbs.gbar_created.cb; - cbdata = handler->cbs.gbar_created.data; - - handler->cbs.gbar_created.cb = NULL; - handler->cbs.gbar_created.data = NULL; - - /*! - * Before call the Callback function, - * gbar_create_cb must be reset. - * Because, in the create callback, user can call create_gbar function again. - */ - cb(handler, status, cbdata); - } else if (status == (int)WIDGET_ERROR_NONE) { - _widget_invoke_event_handler(handler, WIDGET_EVENT_GBAR_CREATED); - } - } - -out: - return NULL; -} - -static struct packet *master_gbar_destroyed(pid_t pid, int handle, const struct packet *packet) -{ - widget_h handler; - struct dlist *l; - struct widget_common *common; - const char *pkgname; - const char *id; - int ret; - int status; - - ret = packet_get(packet, "ssi", &pkgname, &id, &status); - if (ret != 3) { - ErrPrint("Invalid argument\n"); - goto out; - } - - DbgPrint("[%s]\n", pkgname); - common = _widget_find_common_handle(pkgname, id); - if (!common) { - ErrPrint("Instance(%s) is not exists\n", id); - goto out; - } - - if (common->state != WIDGET_STATE_CREATE) { - ErrPrint("Instance(%s) is not created\n", id); - goto out; - } - - if (common->is_gbar_created == 0) { - ErrPrint("GBAR is not created, event is ignored\n"); - goto out; - } - - common->is_gbar_created = 0; - common->request.gbar_destroyed = 0; - - dlist_foreach(common->widget_list, l, handler) { - if (handler->cbs.gbar_destroyed.cb) { - widget_ret_cb cb; - void *cbdata; - - cb = handler->cbs.gbar_destroyed.cb; - cbdata = handler->cbs.gbar_destroyed.data; - - handler->cbs.gbar_destroyed.cb = NULL; - handler->cbs.gbar_destroyed.data = NULL; - - /*! - * Before call the Callback function, - * gbar_destroyed_cb must be reset. - * Because, in the create callback, user can call destroy_gbar function again. - */ - cb(handler, status, cbdata); - } else if (status == (int)WIDGET_ERROR_NONE) { - _widget_invoke_event_handler(handler, WIDGET_EVENT_GBAR_DESTROYED); - } - } - - /*! - * \note - * Lock file should be deleted after all callbacks are processed. - */ - switch (common->gbar.type) { - case GBAR_TYPE_SCRIPT: - case GBAR_TYPE_BUFFER: - switch (fb_type(_widget_get_gbar_fb(common))) { - case WIDGET_FB_TYPE_FILE: - case WIDGET_FB_TYPE_SHM: - widget_service_destroy_lock(common->gbar.lock, 0); - common->gbar.lock = NULL; - break; - case WIDGET_FB_TYPE_PIXMAP: - case WIDGET_FB_TYPE_ERROR: - default: - break; - } - break; - case GBAR_TYPE_UIFW: - case GBAR_TYPE_TEXT: - default: - break; - } - -out: - return NULL; -} - -static struct packet *master_gbar_updated(pid_t pid, int handle, const struct packet *packet) -{ - const char *pkgname; - const char *id; - const char *descfile; - const char *fbfile; - int ret; - widget_h handler; - struct widget_common *common; - struct dlist *l; - int x; - int y; - int w; - int h; - - ret = packet_get(packet, "ssssiiii", &pkgname, &id, &fbfile, &descfile, &x, &y, &w, &h); - if (ret != 8) { - ErrPrint("Invalid argument\n"); - goto out; - } - - common = _widget_find_common_handle(pkgname, id); - if (!common) { - ErrPrint("Instance(%s) is not exists\n", id); - goto out; - } - - common->gbar.last_damage.x = x; - common->gbar.last_damage.y = y; - common->gbar.last_damage.w = w; - common->gbar.last_damage.h = h; - - if (common->state != WIDGET_STATE_CREATE) { - /*! - * \note - * This handler is already deleted by the user. - * So don't try to notice anything about this anymore. - * Just ignore all events. - */ - ErrPrint("Instance(%s) is not created\n", id); - goto out; - } - - if (_widget_text_gbar(common)) { - (void)parse_desc(common, descfile, 1); - } else { - if (conf_frame_drop_for_resizing() && common->request.size_changed) { - /* Just for skipping the update event callback call, After request to resize buffer, update event will be discarded */ - DbgPrint("Discards obsoloted update event\n"); - } else { - (void)_widget_set_gbar_fb(common, fbfile); - - if (!conf_manual_sync()) { - ret = _widget_sync_gbar_fb(common); - if (ret < 0) { - ErrPrint("Failed to do sync FB (%s - %s), %d\n", pkgname, widget_util_basename(util_uri_to_path(id)), ret); - } else { - dlist_foreach(common->widget_list, l, handler) { - _widget_invoke_event_handler(handler, WIDGET_EVENT_GBAR_UPDATED); - } - } - } else { - dlist_foreach(common->widget_list, l, handler) { - _widget_invoke_event_handler(handler, WIDGET_EVENT_GBAR_UPDATED); - } - } - } - } - -out: - return NULL; -} - -static struct packet *master_gbar_extra_buffer_destroyed(pid_t pid, int handle, const struct packet *packet) -{ - widget_h handler; - struct widget_common *common; - const char *pkgname; - struct dlist *l; - struct dlist *n; - const char *id; - int pixmap; - int idx; - int ret; - - if (!packet) { - ErrPrint("Invalid packet\n"); - goto out; - } - - ret = packet_get(packet, "ssii", &pkgname, &id, &pixmap, &idx); - if (ret != 4) { - ErrPrint("Invalid argument\n"); - goto out; - } - - if (idx < 0 || idx >= conf_extra_buffer_count()) { - ErrPrint("Extra buffer count is not matched\n"); - goto out; - } - - common = _widget_find_common_handle(pkgname, id); - if (!common) { - ErrPrint("WIDGET(%s) is not found\n", id); - goto out; - } - - if (common->state != WIDGET_STATE_CREATE) { - ErrPrint("WIDGET(%s) is not created yet\n", id); - goto out; - } - - if (!common->gbar.extra_buffer && conf_extra_buffer_count()) { - common->gbar.extra_buffer = calloc(conf_extra_buffer_count(), sizeof(*common->gbar.extra_buffer)); - if (!common->gbar.extra_buffer) { - ErrPrint("WIDGET(%s) calloc: %d\n", id, errno); - goto out; - } - } - - common->gbar.last_extra_buffer_idx = idx; - if (common->gbar.extra_buffer[idx] != pixmap) { - DbgPrint("Extra buffer Pixmap is not matched %u <> %u\n", common->widget.extra_buffer[idx], pixmap); - } - - dlist_foreach_safe(common->widget_list, l, n, handler) { - _widget_invoke_event_handler(handler, WIDGET_EVENT_GBAR_EXTRA_BUFFER_DESTROYED); - } -out: - return NULL; -} - -static struct packet *master_widget_extra_buffer_destroyed(pid_t pid, int handle, const struct packet *packet) -{ - widget_h handler; - struct widget_common *common; - const char *pkgname; - struct dlist *l; - struct dlist *n; - const char *id; - int idx; - int pixmap; - int ret; - - if (!packet) { - ErrPrint("Invalid packet\n"); - goto out; - } - - ret = packet_get(packet, "ssii", &pkgname, &id, &pixmap, &idx); - if (ret != 4) { - ErrPrint("Invalid argument\n"); - goto out; - } - - if (idx < 0 || idx >= conf_extra_buffer_count()) { - ErrPrint("Extra buffer count is not matched\n"); - goto out; - } - - common = _widget_find_common_handle(pkgname, id); - if (!common) { - ErrPrint("WIDGET(%s) is not found\n", id); - goto out; - } - - if (common->state != WIDGET_STATE_CREATE) { - ErrPrint("WIDGET(%s) is not created yet\n", id); - goto out; - } - - if (!common->widget.extra_buffer && conf_extra_buffer_count()) { - common->widget.extra_buffer = calloc(conf_extra_buffer_count(), sizeof(*common->widget.extra_buffer)); - if (!common->widget.extra_buffer) { - ErrPrint("WIDGET(%s) calloc: %d\n", id, errno); - goto out; - } - } - - common->widget.last_extra_buffer_idx = idx; - if (common->widget.extra_buffer[idx] != pixmap) { - DbgPrint("Extra buffer Pixmap is not matched %u <> %u\n", common->widget.extra_buffer[idx], pixmap); - } - - dlist_foreach_safe(common->widget_list, l, n, handler) { - _widget_invoke_event_handler(handler, WIDGET_EVENT_WIDGET_EXTRA_BUFFER_DESTROYED); - } -out: - return NULL; -} - -static struct packet *master_widget_extra_buffer_created(pid_t pid, int handle, const struct packet *packet) -{ - widget_h handler; - struct widget_common *common; - const char *pkgname; - struct dlist *l; - struct dlist *n; - const char *id; - int idx; - int pixmap; - int ret; - - if (!packet) { - ErrPrint("Invalid packet\n"); - goto out; - } - - ret = packet_get(packet, "ssii", &pkgname, &id, &pixmap, &idx); - if (ret != 4) { - ErrPrint("Invalid argument\n"); - goto out; - } - - if (idx < 0 || idx >= conf_extra_buffer_count()) { - ErrPrint("Extra buffer count is not matched\n"); - goto out; - } - - common = _widget_find_common_handle(pkgname, id); - if (!common) { - ErrPrint("WIDGET(%s) is not found\n", id); - goto out; - } - - if (common->state != WIDGET_STATE_CREATE) { - ErrPrint("WIDGET(%s) is not created yet\n", id); - goto out; - } - - if (!common->widget.extra_buffer && conf_extra_buffer_count()) { - common->widget.extra_buffer = calloc(conf_extra_buffer_count(), sizeof(*common->widget.extra_buffer)); - if (!common->widget.extra_buffer) { - ErrPrint("WIDGET(%s) calloc: %d\n", id, errno); - goto out; - } - } - - common->widget.last_extra_buffer_idx = idx; - common->widget.extra_buffer[idx] = pixmap; - - dlist_foreach_safe(common->widget_list, l, n, handler) { - _widget_invoke_event_handler(handler, WIDGET_EVENT_WIDGET_EXTRA_BUFFER_CREATED); - } -out: - return NULL; -} - -static struct packet *master_gbar_extra_buffer_created(pid_t pid, int handle, const struct packet *packet) -{ - widget_h handler; - struct widget_common *common; - const char *pkgname; - struct dlist *l; - struct dlist *n; - const char *id; - int pixmap; - int idx; - int ret; - - if (!packet) { - ErrPrint("Invalid packet\n"); - goto out; - } - - ret = packet_get(packet, "ssii", &pkgname, &id, &pixmap, &idx); - if (ret != 4) { - ErrPrint("Invalid argument\n"); - goto out; - } - - if (idx < 0 || idx >= conf_extra_buffer_count()) { - ErrPrint("Extra buffer count is not matched\n"); - goto out; - } - - common = _widget_find_common_handle(pkgname, id); - if (!common) { - ErrPrint("WIDGET(%s) is not found\n", id); - goto out; - } - - if (common->state != WIDGET_STATE_CREATE) { - ErrPrint("WIDGET(%s) is not created yet\n", id); - goto out; - } - - if (!common->gbar.extra_buffer && conf_extra_buffer_count()) { - common->gbar.extra_buffer = calloc(conf_extra_buffer_count(), sizeof(*common->gbar.extra_buffer)); - if (!common->gbar.extra_buffer) { - ErrPrint("WIDGET(%s) calloc: %d\n", id, errno); - goto out; - } - } - - common->gbar.last_extra_buffer_idx = idx; - common->gbar.extra_buffer[idx] = pixmap; - - dlist_foreach_safe(common->widget_list, l, n, handler) { - _widget_invoke_event_handler(handler, WIDGET_EVENT_GBAR_EXTRA_BUFFER_CREATED); - } -out: - return NULL; -} - -static struct packet *master_update_mode(pid_t pid, int handle, const struct packet *packet) -{ - widget_h handler; - struct widget_common *common; - struct dlist *l; - struct dlist *n; - const char *pkgname; - const char *id; - int active_mode; - int status; - int ret; - - if (!packet) { - ErrPrint("Invalid packet\n"); - goto out; - } - - ret = packet_get(packet, "ssii", &pkgname, &id, &status, &active_mode); - if (ret != 4) { - ErrPrint("Invalid argument\n"); - goto out; - } - - common = _widget_find_common_handle(pkgname, id); - if (!common) { - ErrPrint("WIDGET(%s) is not found\n", id); - goto out; - } - - if (common->state != WIDGET_STATE_CREATE) { - ErrPrint("WIDGET(%s) is not created yet\n", id); - goto out; - } - - if (status == (int)WIDGET_ERROR_NONE) { - _widget_set_update_mode(common, active_mode); - } - - common->request.update_mode = 0; - dlist_foreach_safe(common->widget_list, l, n, handler) { - if (handler->cbs.update_mode.cb) { - widget_ret_cb cb; - void *cbdata; - - cb = handler->cbs.update_mode.cb; - cbdata = handler->cbs.update_mode.data; - - handler->cbs.update_mode.cb = NULL; - handler->cbs.update_mode.data = NULL; - - cb(handler, status, cbdata); - } else if (status == (int)WIDGET_ERROR_NONE) { - _widget_invoke_event_handler(handler, WIDGET_EVENT_UPDATE_MODE_CHANGED); - } - } - -out: - return NULL; -} - -static struct packet *master_size_changed(pid_t pid, int handle, const struct packet *packet) -{ - widget_h handler; - struct widget_common *common; - const char *pkgname; - const char *id; - const char *fbfile; - int status; - int ret; - int w; - int h; - int is_gbar; - - if (!packet) { - ErrPrint("Invalid packet\n"); - goto out; - } - - ret = packet_get(packet, "sssiiii", &pkgname, &id, &fbfile, &is_gbar, &w, &h, &status); - if (ret != 7) { - ErrPrint("Invalid argument\n"); - goto out; - } - - common = _widget_find_common_handle(pkgname, id); - if (!common) { - ErrPrint("WIDGET(%s) is not found\n", id); - goto out; - } - - if (common->state != WIDGET_STATE_CREATE) { - ErrPrint("WIDGET(%s) is not created yet\n", id); - goto out; - } - - common->request.size_changed = 0; - if (is_gbar) { - /*! - * \NOTE - * GBAR is not able to resized by the client. - * GBAR is only can be managed by the provider. - * So the GBAR has no private resized event handler. - * Notify it via global event handler only. - */ - if (status == (int)WIDGET_ERROR_NONE) { - struct dlist *l; - - _widget_set_gbarsize(common, w, h); - dlist_foreach(common->widget_list, l, handler) { - _widget_invoke_event_handler(handler, WIDGET_EVENT_GBAR_SIZE_CHANGED); - } - } else { - ErrPrint("This is not possible. GBAR Size is changed but the return value is not ZERO (%d)\n", status); - } - } else { - struct dlist *l; - struct dlist *n; - - if (status == (int)WIDGET_ERROR_NONE) { - _widget_set_size(common, w, h); - - /*! - * \NOTE - * If there is a created WIDGET FB, - * Update it too. - */ - if (_widget_get_widget_fb(common)) { - (void)_widget_set_widget_fb(common, fbfile); - - ret = _widget_sync_widget_fb(common); - if (ret < 0) { - ErrPrint("Failed to do sync FB (%s - %s)\n", pkgname, widget_util_basename(util_uri_to_path(id))); - } - - /* Just update the size info only. */ - } - } - - /*! - * \NOTE - * I cannot believe client. - * So I added some log before & after call the user callback. - */ - dlist_foreach_safe(common->widget_list, l, n, handler) { - if (handler->cbs.size_changed.cb) { - widget_ret_cb cb; - void *cbdata; - - cb = handler->cbs.size_changed.cb; - cbdata = handler->cbs.size_changed.data; - - handler->cbs.size_changed.cb = NULL; - handler->cbs.size_changed.data = NULL; - - cb(handler, status, cbdata); - } else if (status == (int)WIDGET_ERROR_NONE) { - _widget_invoke_event_handler(handler, WIDGET_EVENT_WIDGET_SIZE_CHANGED); - } - } - } - -out: - return NULL; -} - -static struct packet *master_period_changed(pid_t pid, int handle, const struct packet *packet) -{ - widget_h handler; - struct widget_common *common; - struct dlist *l; - struct dlist *n; - const char *pkgname; - const char *id; - int ret; - double period; - int status; - - ret = packet_get(packet, "idss", &status, &period, &pkgname, &id); - if (ret != 4) { - ErrPrint("Invalid argument\n"); - goto out; - } - - common = _widget_find_common_handle(pkgname, id); - if (!common) { - ErrPrint("WIDGET(%s) is not found\n", id); - goto out; - } - - if (common->state != WIDGET_STATE_CREATE) { - ErrPrint("WIDGET(%s) is not created\n", id); - goto out; - } - - if (status == (int)WIDGET_ERROR_NONE) { - _widget_set_period(common, period); - } - - common->request.period_changed = 0; - - dlist_foreach_safe(common->widget_list, l, n, handler) { - if (handler->cbs.period_changed.cb) { - widget_ret_cb cb; - void *cbdata; - - cb = handler->cbs.period_changed.cb; - cbdata = handler->cbs.period_changed.data; - - handler->cbs.period_changed.cb = NULL; - handler->cbs.period_changed.data = NULL; - - cb(handler, status, cbdata); - } else if (status == (int)WIDGET_ERROR_NONE) { - _widget_invoke_event_handler(handler, WIDGET_EVENT_PERIOD_CHANGED); - } - } - -out: - return NULL; -} - -static struct packet *master_group_changed(pid_t pid, int handle, const struct packet *packet) -{ - widget_h handler; - struct widget_common *common; - struct dlist *l; - struct dlist *n; - const char *pkgname; - const char *id; - int ret; - const char *cluster; - const char *category; - int status; - - ret = packet_get(packet, "ssiss", &pkgname, &id, &status, &cluster, &category); - if (ret != 5) { - ErrPrint("Invalid argument\n"); - goto out; - } - - common = _widget_find_common_handle(pkgname, id); - if (!common) { - ErrPrint("WIDGET(%s) is not exists\n", id); - goto out; - } - - if (common->state != WIDGET_STATE_CREATE) { - /*! - * \note - * Do no access this handler, - * You cannot believe this handler anymore. - */ - ErrPrint("WIDGET(%s) is not created\n", id); - goto out; - } - - if (status == (int)WIDGET_ERROR_NONE) { - (void)_widget_set_group(common, cluster, category); - } - - common->request.group_changed = 0; - - dlist_foreach_safe(common->widget_list, l, n, handler) { - if (handler->cbs.group_changed.cb) { - widget_ret_cb cb; - void *cbdata; - - cb = handler->cbs.group_changed.cb; - cbdata = handler->cbs.group_changed.data; - - handler->cbs.group_changed.cb = NULL; - handler->cbs.group_changed.data = NULL; - - cb(handler, status, cbdata); - } else if (status == (int)WIDGET_ERROR_NONE) { - _widget_invoke_event_handler(handler, WIDGET_EVENT_GROUP_CHANGED); - } - } - -out: - return NULL; -} - -static struct packet *master_update_id(pid_t pid, int handle, const struct packet *packet) -{ - int ret; - double timestamp; - const char *id; - struct widget_common *common; - - if (!packet) { - ErrPrint("Invalid packet\n"); - return NULL; - } - - ret = packet_get(packet, "ds", ×tamp, &id); - if (ret != 2) { - ErrPrint("Invalid paramter\n"); - return NULL; - } - - common = _widget_find_common_handle_by_timestamp(timestamp); - if (!common) { - ErrPrint("Handle is not found for %d\n", timestamp); - return NULL; - } - - _widget_set_id(common, id); - DbgPrint("Update ID(%s) for %lf\n", id, timestamp); - return NULL; -} - -static struct packet *master_created(pid_t pid, int handle, const struct packet *packet) -{ - widget_h handler; - struct widget_common *common; - struct dlist *l; - - int widget_w; - int widget_h; - int gbar_w; - int gbar_h; - const char *pkgname; - const char *id; - - const char *content; - const char *cluster; - const char *category; - const char *widget_fname; - const char *gbar_fname; - const char *title; - - double timestamp; - const char *auto_launch; - double priority; - int size_list; - int user; - int pinup_supported; - widget_widget_type_e widget_type; - widget_gbar_type_e gbar_type; - double period; - int is_pinned_up; - - int old_state = WIDGET_STATE_DESTROYED; - - int ret; - - ret = packet_get(packet, "dsssiiiisssssdiiiiidsi", - ×tamp, - &pkgname, &id, &content, - &widget_w, &widget_h, &gbar_w, &gbar_h, - &cluster, &category, &widget_fname, &gbar_fname, - &auto_launch, &priority, &size_list, &user, &pinup_supported, - &widget_type, &gbar_type, &period, &title, &is_pinned_up); - if (ret != 22) { - ErrPrint("Invalid argument\n"); - ret = WIDGET_ERROR_INVALID_PARAMETER; - goto out; - } - - ErrPrint("[%lf] pkgname: %s, id: %s, content: %s, " - "gbar_w: %d, gbar_h: %d, widget_w: %d, widget_h: %d, " - "cluster: %s, category: %s, widget_fname: \"%s\", gbar_fname: \"%s\", " - "auto_launch: %s, priority: %lf, size_list: %d, user: %d, pinup: %d, " - "widget_type: %d, gbar_type: %d, period: %lf, title: [%s], is_pinned_up: %d\n", - timestamp, pkgname, id, content, - gbar_w, gbar_h, widget_w, widget_h, - cluster, category, widget_fname, gbar_fname, - auto_launch, priority, size_list, user, pinup_supported, - widget_type, gbar_type, period, title, is_pinned_up); - - common = _widget_find_common_handle_by_timestamp(timestamp); - if (!common) { - handler = _widget_new_widget(pkgname, id, timestamp, cluster, category); - if (!handler) { - ErrPrint("Failed to create a new widget\n"); - ret = WIDGET_ERROR_FAULT; - goto out; - } - common = handler->common; - old_state = common->state; - } else { - if (common->state != WIDGET_STATE_CREATE) { - if (common->state != WIDGET_STATE_DELETE) { - /*! - * \note - * This is not possible!!! - */ - ErrPrint("Invalid handler\n"); - ret = WIDGET_ERROR_INVALID_PARAMETER; - goto out; - } - - /*! - * \note - * After get the delete states, - * call the create callback with deleted result. - */ - } - - old_state = common->state; - - if (common->id && common->request.created == 0) { - ErrPrint("Already created: timestamp[%lf] " - "pkgname[%s], id[%s] content[%s] " - "cluster[%s] category[%s] widget_fname[%s] gbar_fname[%s]\n", - timestamp, pkgname, id, - content, cluster, category, - widget_fname, gbar_fname); - - ret = WIDGET_ERROR_ALREADY_EXIST; - goto out; - } - - _widget_set_id(common, id); - } - - common->request.created = 0; - _widget_set_size(common, widget_w, widget_h); - common->widget.type = widget_type; - common->is_pinned_up = is_pinned_up; - - switch (widget_type) { - case WIDGET_TYPE_UIFW: - case WIDGET_TYPE_FILE: - break; - case WIDGET_TYPE_SCRIPT: - case WIDGET_TYPE_BUFFER: - if (!strlen(widget_fname)) { - break; - } - (void)_widget_set_widget_fb(common, widget_fname); - - /*! - * \note - * WIDGET should create the lock file from here. - * Even if the old_state == WIDGET_STATE_DELETE, - * the lock file will be deleted from deleted event callback. - */ - switch (fb_type(_widget_get_widget_fb(common))) { - case WIDGET_FB_TYPE_FILE: - case WIDGET_FB_TYPE_SHM: - common->widget.lock = widget_service_create_lock(common->id, WIDGET_TYPE_WIDGET, WIDGET_LOCK_READ); - break; - case WIDGET_FB_TYPE_PIXMAP: - case WIDGET_FB_TYPE_ERROR: - default: - break; - } - - ret = _widget_sync_widget_fb(common); - if (ret < 0) { - ErrPrint("Failed to do sync FB (%s - %s)\n", pkgname, widget_util_basename(util_uri_to_path(id))); - } - break; - case WIDGET_TYPE_TEXT: - _widget_set_text_widget(common); - break; - default: - break; - } - - common->gbar.type = gbar_type; - _widget_set_gbarsize(common, gbar_w, gbar_h); - _widget_set_default_gbarsize(common, gbar_w, gbar_h); - switch (gbar_type) { - case GBAR_TYPE_SCRIPT: - case GBAR_TYPE_BUFFER: - if (!strlen(gbar_fname)) { - break; - } - - _widget_set_gbar_fb(common, gbar_fname); - - ret = _widget_sync_gbar_fb(common); - if (ret < 0) { - ErrPrint("Failed to do sync FB (%s - %s)\n", pkgname, widget_util_basename(util_uri_to_path(id))); - } - - /*! - * \brief - * GBAR doesn't need to create the lock file from here. - * Just create it from GBAR_CREATED event. - */ - - break; - case GBAR_TYPE_TEXT: - _widget_set_text_gbar(common); - break; - case GBAR_TYPE_UIFW: - default: - break; - } - - _widget_set_priority(common, priority); - - _widget_set_size_list(common, size_list); - _widget_set_group(common, cluster, category); - - _widget_set_content(common, content); - _widget_set_title(common, title); - - _widget_set_user(common, user); - - _widget_set_auto_launch(common, auto_launch); - _widget_set_pinup(common, pinup_supported); - - _widget_set_period(common, period); - - ret = 0; - - if (common->state == WIDGET_STATE_CREATE) { - dlist_foreach(common->widget_list, l, handler) { - /*! - * \note - * These callback can change the handler->state. - * So we have to use the "old_state" which stored state before call these callbacks - */ - - if (handler->cbs.created.cb) { - widget_ret_cb cb; - void *cbdata; - - cb = handler->cbs.created.cb; - cbdata = handler->cbs.created.data; - - handler->cbs.created.cb = NULL; - handler->cbs.created.data = NULL; - - cb(handler, ret, cbdata); - } else { - _widget_invoke_event_handler(handler, WIDGET_EVENT_CREATED); - } - - /** - * If there is any updates before get this event, - * Invoke all update event forcely - */ - switch (common->widget.last_extra_buffer_idx) { - case WIDGET_UNKNOWN_BUFFER: - break; - case WIDGET_PRIMARY_BUFFER: - DbgPrint("Primary buffer updated\n"); - _widget_invoke_event_handler(handler, WIDGET_EVENT_WIDGET_UPDATED); - break; - default: - DbgPrint("Extra buffer updated\n"); - _widget_invoke_event_handler(handler, WIDGET_EVENT_WIDGET_EXTRA_UPDATED); - break; - } - } - } - -out: - if (ret == 0 && old_state == WIDGET_STATE_DELETE) { - struct dlist *n; - - DbgPrint("Take place an unexpected case [%d]\n", common->refcnt); - dlist_foreach_safe(common->widget_list, l, n, handler) { - if (handler->cbs.created.cb) { - if (!handler->common->request.deleted) { - if (_widget_send_delete(handler, common->delete_type, handler->cbs.created.cb, handler->cbs.created.data) < 0) { - /*! - * \note - * Already sent or something else happens. - * Callback will be called in any cases - */ - } - } else if (handler->state != WIDGET_STATE_DELETE) { - handler->cbs.created.cb(handler, WIDGET_ERROR_CANCELED, handler->cbs.created.data); - _widget_unref(handler, 1); - } - } else { - _widget_invoke_event_handler(handler, WIDGET_EVENT_DELETED); - _widget_unref(handler, 1); - } - } - - /*! - * \note - * handler->cbs.created.cb = NULL; - * handler->cbs.created.data = NULL; - * - * Do not clear this to use this from the deleted event callback. - * if this value is not cleared when the deleted event callback check it, - * it means that the created function is not called yet. - * Then the call the deleted event callback with WIDGET_ERROR_CANCELED errno. - */ - } - - return NULL; -} - -static struct method s_direct_table[] = { - { - .cmd = CMD_STR_WIDGET_UPDATED, /* pkgname, id, lb_w, lb_h, priority, ret */ - .handler = master_widget_updated, - }, - { - .cmd = CMD_STR_GBAR_UPDATED, /* pkgname, id, descfile, pd_w, pd_h, ret */ - .handler = master_gbar_updated, - }, - { - .cmd = CMD_STR_EXTRA_UPDATED, - .handler = master_extra_updated, - }, - { - .cmd = NULL, - .handler = NULL, - }, -}; - -static struct method s_table[] = { - { /* WIDGET_UPDATED */ - .cmd = CMD_STR_WIDGET_UPDATED, /* pkgname, id, widget_w, widget_h, priority, ret */ - .handler = master_widget_updated, - }, - { /* GBAR_UPDATED */ - .cmd = CMD_STR_GBAR_UPDATED, /* pkgname, id, descfile, pd_w, pd_h, ret */ - .handler = master_gbar_updated, - }, - { /* EXTRA_UPDATED */ - .cmd = CMD_STR_EXTRA_UPDATED, - .handler = master_extra_updated, - }, - { /* EXTRA_INFO */ - .cmd = CMD_STR_EXTRA_INFO, - .handler = master_extra_info, - }, - { /* DELETED */ - .cmd = CMD_STR_DELETED, /* pkgname, id, timestamp, ret */ - .handler = master_deleted, - }, - { /* FAULTED */ - .cmd = CMD_STR_FAULT_PACKAGE, /* pkgname, id, function, ret */ - .handler = master_fault_package, - }, - { /* SCROLL */ - .cmd = CMD_STR_SCROLL, - .handler = master_hold_scroll, - }, - { /* WIDGET_UPDATE_BEGIN */ - .cmd = CMD_STR_WIDGET_UPDATE_BEGIN, - .handler = master_widget_update_begin, - }, - { /* WIDGET_UPDATE_END */ - .cmd = CMD_STR_WIDGET_UPDATE_END, - .handler = master_widget_update_end, - }, - { /* GBAR_UPDATE_BEGIN */ - .cmd = CMD_STR_GBAR_UPDATE_BEGIN, - .handler = master_gbar_update_begin, - }, - { /* GBAR_UPDATE_END */ - .cmd = CMD_STR_GBAR_UPDATE_END, - .handler = master_gbar_update_end, - }, - { /* ACCESS_STATUS */ - .cmd = CMD_STR_ACCESS_STATUS, - .handler = master_access_status, - }, - { /* KEY_STATUS */ - .cmd = CMD_STR_KEY_STATUS, - .handler = master_key_status, - }, - { /* CLOSE_GBAR */ - .cmd = CMD_STR_CLOSE_GBAR, - .handler = master_request_close_gbar, - }, - { /* GBAR_CREATED */ - .cmd = CMD_STR_GBAR_CREATED, - .handler = master_gbar_created, - }, - { /* GBAR_DESTROYED */ - .cmd = CMD_STR_GBAR_DESTROYED, - .handler = master_gbar_destroyed, - }, - { /* CREATED */ - .cmd = CMD_STR_CREATED, - .handler = master_created, - }, - { /* GROUP_CHANGED */ - .cmd = CMD_STR_GROUP_CHANGED, - .handler = master_group_changed, - }, - { /* PERIOD_CHANGED */ - .cmd = CMD_STR_PERIOD_CHANGED, - .handler = master_period_changed, - }, - { /* SIZE_CHANGED */ - .cmd = CMD_STR_SIZE_CHANGED, - .handler = master_size_changed, - }, - { /* PINUP */ - .cmd = CMD_STR_PINUP, - .handler = master_pinup, - }, - { /* UPDATE_MODE */ - .cmd = CMD_STR_UPDATE_MODE, - .handler = master_update_mode, - }, - { /* WIDGET_CREATE_XBUF */ - .cmd = CMD_STR_WIDGET_CREATE_XBUF, - .handler = master_widget_extra_buffer_created, - }, - { /* GBAR_CREATE_XBUF */ - .cmd = CMD_STR_GBAR_CREATE_XBUF, - .handler = master_gbar_extra_buffer_created, - }, - { /* WIDGET_DESTROY_XBUF */ - .cmd = CMD_STR_WIDGET_DESTROY_XBUF, - .handler = master_widget_extra_buffer_destroyed, - }, - { /* GBAR_DESTROY_XBUF */ - .cmd = CMD_STR_GBAR_DESTROY_XBUF, - .handler = master_gbar_extra_buffer_destroyed, - }, - { /* UPDATE_ID */ - .cmd = CMD_STR_UPDATE_ID, - .handler = master_update_id, - }, - { - .cmd = NULL, - .handler = NULL, - }, -}; - -static void make_direct_connection(void) -{ - struct packet *packet; - int ret; - - s_info.master_direct_fd = com_core_packet_client_init(SHARED_SOCKET, 0, s_direct_table); - if (s_info.master_direct_fd < 0) { - ErrPrint("Failed to create a connection\n"); - return; - } - - packet = packet_create_noack(CMD_STR_DIRECT_HELLO, "s", client_direct_addr()); - if (!packet) { - ErrPrint("Packet is not valid\n"); - return; - } - - ret = com_core_packet_send_only(s_info.master_direct_fd, packet); - packet_destroy(packet); - - DbgPrint("Direct connection request is sent: %d\n", ret); -} - -static void acquire_cb(widget_h handler, const struct packet *result, void *data) -{ - if (!result) { - DbgPrint("Result packet is not valid\n"); - } else { - int ret; - int extra_buffer_count; - - if (packet_get(result, "ii", &ret, &extra_buffer_count) != 2) { - ErrPrint("Invalid argument\n"); - } else { - DbgPrint("Acquire returns: %d (%d)\n", ret, extra_buffer_count); - conf_set_extra_buffer_count(extra_buffer_count); - /** - * Now the master has client object. - * We can make a direct connection handler from now. - */ - make_direct_connection(); - } - } - - return; -} - -static void prepare_direct_update(void) -{ - char path[MAX_DIRECT_ADDR]; - - if (!conf_direct_update()) { - return; - } - - if (s_info.direct_addr) { - DbgPrint("Direct path is already initiated: %s\n", s_info.direct_addr); - return; - } - - if (!strncmp(s_info.client_addr, COM_CORE_REMOTE_SCHEME, strlen(COM_CORE_REMOTE_SCHEME))) { - ErrPrint("Remote model is not support this\n"); - return; - } - - snprintf(path, sizeof(path) - 1, "%s/.%d.%lf.widget.viewer", WIDGET_CONF_IMAGE_PATH, getpid(), util_timestamp()); - - s_info.direct_addr = strdup(path); - if (!s_info.direct_addr) { - ErrPrint("strdup: %d\n", errno); - return; - } - - s_info.direct_fd = com_core_packet_server_init(client_direct_addr(), s_direct_table); - if (s_info.direct_fd < 0) { - ErrPrint("Failed to prepare server: %s\n", client_direct_addr()); - free(s_info.direct_addr); - s_info.direct_addr = NULL; - return; - } - - DbgPrint("Direct update is prepared: %s - %d\n", client_direct_addr(), client_direct_fd()); -} - -static inline int make_connection(void) -{ - struct packet *packet; - unsigned int cmd = CMD_ACQUIRE; - int ret; - - /** - * @note - * Before creating a connection with master, - * Initiate the private channel for getting the updated event from providers - * And this channel should be created after the master is launched. - * Or the master will delete all files in the shared folder. - */ - prepare_direct_update(); - - DbgPrint("Let's making connection!\n"); - - s_info.fd = com_core_packet_client_init(client_addr(), 0, s_table); - if (s_info.fd < 0) { - ErrPrint("Try this again later\n"); - return WIDGET_ERROR_IO_ERROR; - } - - packet = packet_create((const char *)&cmd, "ds", util_timestamp(), client_direct_addr()); - if (!packet) { - com_core_packet_client_fini(s_info.fd); - s_info.fd = -1; - return WIDGET_ERROR_FAULT; - } - - ret = master_rpc_async_request(NULL, packet, 1, acquire_cb, NULL); - if (ret < 0) { - ErrPrint("Master RPC returns %d\n", ret); - com_core_packet_client_fini(s_info.fd); - s_info.fd = -1; - return WIDGET_ERROR_IO_ERROR; - } - - return WIDGET_ERROR_NONE; -} - -static int connected_cb(int handle, void *data) -{ - if (s_info.fd == handle) { - master_rpc_check_and_fire_consumer(); - } - return 0; -} - -static void master_started_cb(keynode_t *node, void *data) -{ - int state = 0; - - if (vconf_get_bool(VCONFKEY_MASTER_STARTED, &state) < 0) { - ErrPrint("Unable to get [%s]\n", VCONFKEY_MASTER_STARTED); - } - - DbgPrint("Master state: %d\n", state); - if (state == 1 && make_connection() == (int)WIDGET_ERROR_NONE) { - int ret; - ret = vconf_ignore_key_changed(VCONFKEY_MASTER_STARTED, master_started_cb); - if (ret < 0) { - DbgPrint("master_started vconf key de-registered [%d]\n", ret); - } - } -} - -static gboolean timeout_cb(gpointer data) -{ - if (vconf_notify_key_changed(VCONFKEY_MASTER_STARTED, master_started_cb, NULL) < 0) { - ErrPrint("Failed to add vconf for monitoring service state\n"); - } else { - DbgPrint("vconf event callback is registered\n"); - } - - master_started_cb(NULL, NULL); - - s_info.timer_id = 0; - return FALSE; -} - -static int disconnected_cb(int handle, void *data) -{ - if (s_info.fd != handle) { - /*!< This handle is not my favor */ - return 0; - } - - s_info.fd = -1; /*!< Disconnected */ - - master_rpc_clear_all_request(); - _widget_invoke_fault_handler(WIDGET_FAULT_PROVIDER_DISCONNECTED, MASTER_PKGNAME, "default", "disconnected"); - - _widget_delete_all(); - - /* Try to reconnect after 1 sec later */ - if (!s_info.timer_id) { - DbgPrint("Reconnecting timer is added\n"); - s_info.timer_id = g_timeout_add(1000, timeout_cb, NULL); - if (s_info.timer_id == 0) { - ErrPrint("Unable to add reconnecting timer\n"); - return 0; - } - } else { - ErrPrint("Reconnecting timer is already exists\n"); - } - - return 0; -} - -int client_init(int use_thread) -{ - widget_conf_init(); - - com_core_packet_use_thread(use_thread); - - s_info.client_addr = vconf_get_str(VCONFKEY_MASTER_CLIENT_ADDR); - if (!s_info.client_addr) { - s_info.client_addr = strdup(CLIENT_SOCKET); - if (!s_info.client_addr) { - ErrPrint("Heap: %d\n", errno); - return WIDGET_ERROR_OUT_OF_MEMORY; - } - } - - (void)file_service_init(); - - DbgPrint("Server Address: %s\n", s_info.client_addr); - - com_core_add_event_callback(CONNECTOR_DISCONNECTED, disconnected_cb, NULL); - com_core_add_event_callback(CONNECTOR_CONNECTED, connected_cb, NULL); - - if (vconf_notify_key_changed(VCONFKEY_MASTER_STARTED, master_started_cb, NULL) < 0) { - ErrPrint("Failed to add vconf for service state\n"); - } else { - DbgPrint("vconf event callback is registered\n"); - } - - master_started_cb(NULL, NULL); - return WIDGET_ERROR_NONE; -} - -int client_fd(void) -{ - return s_info.fd; -} - -const char *client_addr(void) -{ - return s_info.client_addr; -} - -const char *client_direct_addr(void) -{ - return s_info.direct_addr; -} - -int client_direct_fd(void) -{ - return s_info.direct_fd; -} - -int client_fini(void) -{ - int ret; - - (void)file_service_fini(); - - ret = vconf_ignore_key_changed(VCONFKEY_MASTER_STARTED, master_started_cb); - if (ret < 0) { - DbgPrint("Ignore vconf key: %d\n", ret); - } - - com_core_del_event_callback(CONNECTOR_DISCONNECTED, disconnected_cb, NULL); - com_core_del_event_callback(CONNECTOR_CONNECTED, connected_cb, NULL); - - if (s_info.fd >= 0) { - com_core_packet_client_fini(s_info.fd); - s_info.fd = -1; - } - - if (s_info.master_direct_fd >= 0) { - com_core_packet_client_fini(s_info.master_direct_fd); - s_info.master_direct_fd = -1; - } - - if (s_info.direct_fd >= 0) { - com_core_packet_server_fini(s_info.direct_fd); - s_info.direct_fd = -1; - } - - if (s_info.timer_id > 0) { - g_source_remove(s_info.timer_id); - s_info.timer_id = 0; - } - - free(s_info.client_addr); - s_info.client_addr = NULL; - - free(s_info.direct_addr); - s_info.direct_addr = NULL; - - widget_conf_reset(); - return WIDGET_ERROR_NONE; -} - -/* End of a file */ diff --git a/widget_viewer/src/conf.c b/widget_viewer/src/conf.c deleted file mode 100644 index fce80d3..0000000 --- a/widget_viewer/src/conf.c +++ /dev/null @@ -1,82 +0,0 @@ -#include -#include - -static struct info { - int manual_sync; - int frame_drop_for_resizing; - int shared_content; - int direct_update; - int extra_buffer_count; - - double event_filter; -} s_info = { - .manual_sync = 0, - .frame_drop_for_resizing = 1, - .shared_content = 0, - .direct_update = 0, - .extra_buffer_count = 0, - - .event_filter = 0.01f, -}; - -void conf_set_direct_update(int flag) -{ - s_info.direct_update = flag; -} - -int conf_direct_update(void) -{ - return s_info.direct_update; -} - -void conf_set_manual_sync(int flag) -{ - s_info.manual_sync = flag; -} - -int conf_manual_sync(void) -{ - return s_info.manual_sync; -} - -void conf_set_frame_drop_for_resizing(int flag) -{ - s_info.frame_drop_for_resizing = flag; -} - -int conf_frame_drop_for_resizing(void) -{ - return s_info.frame_drop_for_resizing; -} - -void conf_set_shared_content(int flag) -{ - s_info.shared_content = flag; -} - -int conf_shared_content(void) -{ - return s_info.shared_content; -} - -double conf_event_filter(void) -{ - return s_info.event_filter; -} - -void conf_set_event_filter(double filter) -{ - s_info.event_filter = filter; -} - -void conf_set_extra_buffer_count(int buffer_count) -{ - s_info.extra_buffer_count = buffer_count; -} - -int conf_extra_buffer_count(void) -{ - return s_info.extra_buffer_count; -} - -/* End of a file */ diff --git a/widget_viewer/src/desc_parser.c b/widget_viewer/src/desc_parser.c deleted file mode 100644 index de8f283..0000000 --- a/widget_viewer/src/desc_parser.c +++ /dev/null @@ -1,701 +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 -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include "debug.h" -#include "widget_viewer.h" -#include "widget_viewer_internal.h" -#include "desc_parser.h" -#include "dlist.h" -#include "util.h" - -#define INFO_SIZE "size" -#define INFO_CATEGORY "category" - -static const char *type_list[] = { - "access", - "access,operation", - "color", - "drag", - "image", - "info", - "script", - "signal", - "text", - NULL -}; - -static const char *field_list[] = { - "type", - "part", - "data", - "option", - "id", - "target", - "file", - NULL -}; - -enum block_type { - TYPE_ACCESS, - TYPE_ACCESS_OP, - TYPE_COLOR, - TYPE_DRAG, - TYPE_IMAGE, - TYPE_INFO, - TYPE_SCRIPT, - TYPE_SIGNAL, - TYPE_TEXT, - TYPE_MAX -}; - -enum field_type { - FIELD_TYPE, - FIELD_PART, - FIELD_DATA, - FIELD_OPTION, - FIELD_ID, - FIELD_TARGET, - FIELD_FILE -}; - -struct block { - enum block_type type; - char *part; - char *data; - char *option; - char *id; - char *target; - char *file; - - /* Should be released */ - char *filebuf; - const char *filename; -}; - -static int update_text(widget_h handle, struct block *block, int is_gbar) -{ - struct widget_script_operators *ops; - - if (!block || !block->part || !block->data) { - ErrPrint("Invalid argument\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - ops = is_gbar ? &handle->cbs.gbar_ops : &handle->cbs.widget_ops; - if (ops->update_text) { - ops->update_text(handle, (const char *)block->id, (const char *)block->part, (const char *)block->data); - } - - return 0; -} - -static int update_image(widget_h handle, struct block *block, int is_gbar) -{ - struct widget_script_operators *ops; - - if (!block || !block->part) { - ErrPrint("Invalid argument\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - ops = is_gbar ? &handle->cbs.gbar_ops : &handle->cbs.widget_ops; - if (ops->update_image) { - ops->update_image(handle, block->id, block->part, block->data, block->option); - } - - return 0; -} - -static int update_script(widget_h handle, struct block *block, int is_gbar) -{ - struct widget_script_operators *ops; - - if (!block || !block->part) { - ErrPrint("Invalid argument\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - ops = is_gbar ? &handle->cbs.gbar_ops : &handle->cbs.widget_ops; - if (ops->update_script) { - ops->update_script(handle, block->id, block->target, block->part, block->data, block->option); - } - - return 0; -} - -static int update_signal(widget_h handle, struct block *block, int is_gbar) -{ - struct widget_script_operators *ops; - - if (!block) { - ErrPrint("Invalid argument\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - ops = is_gbar ? &handle->cbs.gbar_ops : &handle->cbs.widget_ops; - if (ops->update_signal) { - ops->update_signal(handle, block->id, block->data, block->part); - } - - return 0; -} - -static int update_drag(widget_h handle, struct block *block, int is_gbar) -{ - double dx, dy; - struct widget_script_operators *ops; - - if (!block || !block->data || !block->part) { - ErrPrint("Invalid argument\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (sscanf(block->data, "%lfx%lf", &dx, &dy) != 2) { - ErrPrint("Invalid format of data\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - ops = is_gbar ? &handle->cbs.gbar_ops : &handle->cbs.widget_ops; - if (ops->update_drag) { - ops->update_drag(handle, block->id, block->part, dx, dy); - } - - return 0; -} - -static int update_info(widget_h handle, struct block *block, int is_gbar) -{ - struct widget_script_operators *ops; - - if (!block || !block->part || !block->data) { - ErrPrint("Invalid argument\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - ops = is_gbar ? &handle->cbs.gbar_ops : &handle->cbs.widget_ops; - if (!strcasecmp(block->part, INFO_SIZE)) { - int w, h; - - if (sscanf(block->data, "%dx%d", &w, &h) != 2) { - ErrPrint("Invalid format (%s)\n", block->data); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (ops->update_info_size) { - ops->update_info_size(handle, block->id, w, h); - } - } else if (!strcasecmp(block->part, INFO_CATEGORY)) { - if (ops->update_info_category) { - ops->update_info_category(handle, block->id, block->data); - } - } - - return 0; -} - -static int update_access(widget_h handle, struct block *block, int is_gbar) -{ - struct widget_script_operators *ops; - - if (!block) { - ErrPrint("Invalid argument\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - ops = is_gbar ? &handle->cbs.gbar_ops : &handle->cbs.widget_ops; - if (ops->update_access) { - ops->update_access(handle, block->id, block->part, block->data, block->option); - } - - return 0; -} - -static int operate_access(widget_h handle, struct block *block, int is_gbar) -{ - struct widget_script_operators *ops; - - if (!block) { - ErrPrint("Invalid argument\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - ops = is_gbar ? &handle->cbs.gbar_ops : &handle->cbs.widget_ops; - if (ops->operate_access) { - ops->operate_access(handle, block->id, block->part, block->data, block->option); - } - - return 0; -} - -static int update_color(widget_h handle, struct block *block, int is_gbar) -{ - struct widget_script_operators *ops; - - if (!block) { - ErrPrint("Invalid argument\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - ops = is_gbar ? &handle->cbs.gbar_ops : &handle->cbs.widget_ops; - if (ops->update_color) { - ops->update_color(handle, block->id, block->part, block->data); - } - - return 0; -} - -static inline int update_begin(widget_h handle, int is_gbar) -{ - struct widget_script_operators *ops; - - ops = is_gbar ? &handle->cbs.gbar_ops : &handle->cbs.widget_ops; - if (ops->update_begin) { - ops->update_begin(handle); - } - - return 0; -} - -static inline int update_end(widget_h handle, int is_gbar) -{ - struct widget_script_operators *ops; - - ops = is_gbar ? &handle->cbs.gbar_ops : &handle->cbs.widget_ops; - if (ops->update_end) { - ops->update_end(handle); - } - - return 0; -} - -static inline void delete_block(struct block *block) -{ - free(block->filebuf); - free(block); -} - -static inline void consuming_parsed_block(widget_h handle, int is_gbar, struct block *block) -{ - typedef int (*update_function_t)(widget_h handle, struct block *block, int is_gbar); - static update_function_t updators[] = { - update_access, - operate_access, - update_color, - update_drag, - update_image, - update_info, - update_script, - update_signal, - update_text, - NULL - }; - - if (block->type >= 0 || block->type < TYPE_MAX) { - (void)updators[block->type](handle, block, is_gbar); - } else { - ErrPrint("Block type[%d] is not valid\n", block->type); - } -} - -static inline char *load_file(const char *filename) -{ - char *filebuf = NULL; - int fd; - off_t filesize; - int ret; - size_t readsize = 0; - - fd = open(filename, O_RDONLY); - if (fd < 0) { - ErrPrint("open: %d (%s)\n", errno, filename); - return NULL; - } - - filesize = lseek(fd, 0L, SEEK_END); - if (filesize == (off_t)-1) { - ErrPrint("lseek: %d\n", errno); - goto errout; - } - - if (lseek(fd, 0L, SEEK_SET) < 0) { - ErrPrint("lseek: %d\n", errno); - goto errout; - } - - filebuf = malloc(filesize + 1); - if (!filebuf) { - ErrPrint("malloc: %d\n", errno); - goto errout; - } - - while (readsize < filesize) { - ret = read(fd, filebuf + readsize, (size_t)filesize - readsize); - if (ret < 0) { - if (errno == EINTR) { - DbgPrint("Read is interrupted\n"); - continue; - } - - ErrPrint("read: %d\n", errno); - free(filebuf); - filebuf = NULL; - break; - } - - readsize += ret; - } - - if (filebuf) { - filebuf[readsize] = '\0'; - } - - /*! - * \note - * Now, we are ready to parse the filebuf. - */ - -errout: - if (close(fd) < 0) { - ErrPrint("close: %d\n", errno); - } - - return filebuf; -} - -int parse_desc(struct widget_common *common, const char *filename, int is_gbar) -{ - int type_idx = 0; - int type_len = 0; - int field_idx = 0; - int field_len = 0; - char *filebuf; - char *fileptr; - char *ptr = NULL; - struct block *block = NULL; - struct dlist *block_list = NULL; - struct dlist *l; - struct dlist *n; - struct dlist *handle_iterator; - widget_h handler; - enum state { - BEGIN, - FIELD, - DATA, - END, - DONE, - ERROR, - } state; - - filebuf = load_file(filename); - if (!filebuf) { - return WIDGET_ERROR_IO_ERROR; - } - - fileptr = filebuf; - - state = BEGIN; - while (*fileptr && state != ERROR) { - switch (state) { - case BEGIN: - if (*fileptr == '{') { - if (block) - free(block); - block = calloc(1, sizeof(*block)); - if (!block) { - ErrPrint("calloc: %d\n", errno); - state = ERROR; - continue; - } - state = FIELD; - ptr = NULL; - } - break; - case FIELD: - if (isspace(*fileptr)) { - if (ptr != NULL) { - *fileptr = '\0'; - } - } else if (*fileptr == '=') { - *fileptr = '\0'; - ptr = NULL; - state = DATA; - } else if (ptr == NULL) { - ptr = fileptr; - field_idx = 0; - field_len = 0; - - while (field_list[field_idx]) { - if (field_list[field_idx][field_len] == *fileptr) { - break; - } - field_idx++; - } - - if (!field_list[field_idx]) { - ErrPrint("Invalid field\n"); - state = ERROR; - continue; - } - - field_len++; - } else { - if (field_list[field_idx][field_len] != *fileptr) { - field_idx++; - while (field_list[field_idx]) { - if (!strncmp(field_list[field_idx], fileptr - field_len, field_len)) { - break; - } else { - field_idx++; - } - } - - if (!field_list[field_idx]) { - state = ERROR; - ErrPrint("field is not valid\n"); - continue; - } - } - - field_len++; - } - break; - case DATA: - switch (field_idx) { - case FIELD_TYPE: - if (ptr == NULL) { - if (isspace(*fileptr)) { - break; - } - - if (*fileptr == '\0') { - state = ERROR; - ErrPrint("Type is not valid\n"); - continue; - } - - ptr = fileptr; - type_idx = 0; - type_len = 0; - } - - if (*fileptr && (*fileptr == '\n' || *fileptr == '\r' || *fileptr == '\f')) { - *fileptr = '\0'; - } - - if (type_list[type_idx][type_len] != *fileptr) { - type_idx++; - while (type_list[type_idx]) { - if (!strncmp(type_list[type_idx], fileptr - type_len, type_len)) { - break; - } else { - type_idx++; - } - } - - if (!type_list[type_idx]) { - state = ERROR; - ErrPrint("type is not valid (%s)\n", fileptr - type_len); - continue; - } - } - - if (!*fileptr) { - block->type = type_idx; - state = DONE; - ptr = NULL; - } - - type_len++; - break; - case FIELD_PART: - if (ptr == NULL) { - ptr = fileptr; - } - - if (*fileptr && (*fileptr == '\n' || *fileptr == '\r' || *fileptr == '\f')) { - *fileptr = '\0'; - } - - if (!*fileptr) { - block->part = ptr; - state = DONE; - ptr = NULL; - } - break; - case FIELD_DATA: - if (ptr == NULL) { - ptr = fileptr; - } - - if (*fileptr && (*fileptr == '\n' || *fileptr == '\r' || *fileptr == '\f')) { - *fileptr = '\0'; - } - - if (!*fileptr) { - block->data = ptr; - state = DONE; - ptr = NULL; - } - break; - case FIELD_OPTION: - if (ptr == NULL) { - ptr = fileptr; - } - - if (*fileptr && (*fileptr == '\n' || *fileptr == '\r' || *fileptr == '\f')) { - *fileptr = '\0'; - } - - if (!*fileptr) { - block->option = ptr; - state = DONE; - ptr = NULL; - } - break; - case FIELD_ID: - if (ptr == NULL) { - ptr = fileptr; - } - - if (*fileptr && (*fileptr == '\n' || *fileptr == '\r' || *fileptr == '\f')) { - *fileptr = '\0'; - } - - if (!*fileptr) { - block->id = ptr; - state = DONE; - ptr = NULL; - } - break; - case FIELD_TARGET: - if (ptr == NULL) { - ptr = fileptr; - } - - if (*fileptr && (*fileptr == '\n' || *fileptr == '\r' || *fileptr == '\f')) { - *fileptr = '\0'; - } - - if (!*fileptr) { - block->target = ptr; - state = DONE; - ptr = NULL; - } - break; - case FIELD_FILE: - if (ptr == NULL) { - ptr = fileptr; - } - - if (*fileptr && (*fileptr == '\n' || *fileptr == '\r' || *fileptr == '\f')) { - *fileptr = '\0'; - } - - if (!*fileptr) { - block->target = ptr; - state = DONE; - ptr = NULL; - } - default: - break; - } - - break; - case DONE: - if (isspace(*fileptr)) { - } else if (*fileptr == '}') { - state = BEGIN; - block->filename = filename; - block_list = dlist_append(block_list, block); - block = NULL; - } else { - state = FIELD; - continue; - } - break; - case END: - default: - break; - } - - fileptr++; - } - - if (state != BEGIN) { - struct dlist *l; - struct dlist *n; - ErrPrint("State %d\n", state); - - free(filebuf); - free(block); - - dlist_foreach_safe(block_list, l, n, block) { - free(block); - block_list = dlist_remove(block_list, l); - } - - return WIDGET_ERROR_FAULT; - } - - - block = dlist_data(dlist_prev(block_list)); - if (block) { - block->filebuf = filebuf; - } else { - ErrPrint("Last block is not exists (There is no parsed block)\n"); - free(filebuf); - } - - ErrPrint("Begin: Set content for object\n"); - dlist_foreach(common->widget_list, l, handler) { - update_begin(handler, is_gbar); - } - - dlist_foreach_safe(block_list, l, n, block) { - dlist_foreach(common->widget_list, handle_iterator, handler) { - consuming_parsed_block(handler, is_gbar, block); - } - - block_list = dlist_remove(block_list, l); - delete_block(block); - } - - dlist_foreach(common->widget_list, l, handler) { - update_end(handler, is_gbar); - } - ErrPrint("End: Set content for object\n"); - - return WIDGET_ERROR_NONE; -} - -/* End of a file */ diff --git a/widget_viewer/src/dlist.c b/widget_viewer/src/dlist.c deleted file mode 100644 index 5b48b86..0000000 --- a/widget_viewer/src/dlist.c +++ /dev/null @@ -1,189 +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" - -/*! - * \brief - * This dlist is called Modified Doubly Linked List. - * - * Noramlly, The dobule linked list contains address of previous and next element. - * This dlist also contains them, but the tail element only contains prev address. - * - * The head element's prev pointer indicates the last element. - * But the last element's next pointer indicates NIL. - * - * So we can find the last element while crawling this DList - * But we have to remember the address of the head element. - */ - -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; - } - - item->data = data; - - if (!list) { - item->prev = item; - item->next = NULL; - } else { - if (list->prev->next) { - list->prev->next = item; - } - - item->prev = list->prev; - item->next = list; - - list->prev = item; - - } - - return item; -} - -struct dlist *dlist_remove(struct dlist *list, struct dlist *l) -{ - if (!list || !l) { - return NULL; - } - - if (l == list) { - list = l->next; - } else { - l->prev->next = l->next; - } - - if (l->next) { - l->next->prev = l->prev; - } - /*! - * \note - * If the removed entry 'l' has no next element, it is the last element. - * In this case, check the existence of the list first, - * and if the list is not empty, update the 'prev' of the list (which is a head element of the list) - * - * If we didn't care about this, the head element(list) can indicates the invalid element. - */ - else if (list) { - list->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; - - i = 0; - for (n = l; n; n = n->next) { - if (i == nth) { - return n; - } - i++; - } - - return NULL; -} - -/* End of a file */ diff --git a/widget_viewer/src/fb.c b/widget_viewer/src/fb.c deleted file mode 100644 index a31e72c..0000000 --- a/widget_viewer/src/fb.c +++ /dev/null @@ -1,682 +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 -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include /* For error code */ -#include /* For buffer event data */ -#include - -#include "debug.h" -#include "util.h" -#include "fb.h" - -int errno; - -static struct { - Display *disp; - int screen; - Visual *visual; - int disp_is_opened; -} s_info = { - .disp = NULL, - .disp_is_opened = 0, - .screen = -1, - .visual = NULL, -}; - -int fb_init(void *disp) -{ - s_info.disp = disp; - if (s_info.disp) { - Screen *screen; - - screen = DefaultScreenOfDisplay(s_info.disp); - - s_info.screen = DefaultScreen(s_info.disp); - s_info.visual = DefaultVisualOfScreen(screen); - } - - return WIDGET_ERROR_NONE; -} - -int fb_fini(void) -{ - if (s_info.disp_is_opened && s_info.disp) { - XCloseDisplay(s_info.disp); - } - - s_info.disp = NULL; - s_info.disp_is_opened = 0; - s_info.visual = NULL; - s_info.screen = -1; - return WIDGET_ERROR_NONE; -} - -static inline void update_fb_size(struct fb_info *info) -{ - info->bufsz = info->w * info->h * info->pixels; -} - -static int sync_for_file(struct fb_info *info, int x, int y, int w, int h) -{ - int fd; - widget_fb_t buffer; - const char *path = NULL; - - buffer = info->buffer; - - if (!buffer) { /* Ignore this sync request */ - return WIDGET_ERROR_NONE; - } - - if (buffer->state != WIDGET_FB_STATE_CREATED) { - ErrPrint("Invalid state of a FB\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (buffer->type != WIDGET_FB_TYPE_FILE) { - ErrPrint("Invalid buffer\n"); - return WIDGET_ERROR_NONE; - } - - path = util_uri_to_path(info->id); - - if (path == NULL) { - ErrPrint("Invalid parameter\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - fd = open(path, O_RDONLY); - if (fd < 0) { - ErrPrint("Failed to open a file (%s) because of (%d)\n", - util_uri_to_path(info->id), errno); - - /** - * @note - * But return ZERO, even if we couldn't get a buffer file, - * the viewer can draw empty screen. - * - * and then update it after it gots update events - */ - return WIDGET_ERROR_NONE; - } - - /** - * @note - * Could we get some advantage if we load a part of file instead of loading all of them? - */ - if (x != 0 || y != 0 || info->w != w || info->h != h) { - int iy; - register int index; - register int width; - - for (iy = y; iy < h; iy++) { - index = iy * info->w + x; - width = w * info->pixels; - - if (lseek(fd, index * info->pixels, SEEK_SET) != index * info->pixels) { - ErrPrint("lseek: %d\n", errno); - if (close(fd) < 0) { - ErrPrint("close: %d\n", errno); - } - /** - * @note - * But return ZERO, even if we couldn't get a buffer file, - * the viewer can draw empty screen. - * - * and then update it after it gots update events - */ - return WIDGET_ERROR_NONE; - } - - if (read(fd, ((unsigned int *)buffer->data) + index, width) != width) { - if (close(fd) < 0) { - ErrPrint("close: %d\n", errno); - } - /** - * @note - * But return ZERO, even if we couldn't get a buffer file, - * the viewer can draw empty screen. - * - * and then update it after it gots update events - */ - return WIDGET_ERROR_NONE; - } - } - } else { - if (read(fd, buffer->data, info->bufsz) != info->bufsz) { - ErrPrint("read: %d\n", errno); - if (close(fd) < 0) { - ErrPrint("close: %d\n", errno); - } - - /** - * @note - * But return ZERO, even if we couldn't get a buffer file, - * the viewer can draw empty screen. - * - * and then update it after it gots update events - */ - return WIDGET_ERROR_NONE; - } - } - - if (close(fd) < 0) { - ErrPrint("close: %d\n", errno); - } - return WIDGET_ERROR_NONE; -} - -static int sync_for_pixmap(struct fb_info *info, int x, int y, int w, int h) -{ - widget_fb_t buffer; - XShmSegmentInfo si; - XImage *xim; - - buffer = info->buffer; - if (!buffer) { /*!< Ignore this sync request */ - return WIDGET_ERROR_NONE; - } - - if (buffer->state != WIDGET_FB_STATE_CREATED) { - ErrPrint("Invalid state of a FB\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (buffer->type != WIDGET_FB_TYPE_PIXMAP) { - ErrPrint("Invalid buffer\n"); - return WIDGET_ERROR_NONE; - } - - if (!s_info.disp) { - s_info.disp = XOpenDisplay(NULL); - if (s_info.disp) { - Screen *screen; - - s_info.disp_is_opened = 1; - - screen = DefaultScreenOfDisplay(s_info.disp); - - s_info.screen = DefaultScreen(s_info.disp); - s_info.visual = DefaultVisualOfScreen(screen); - } else { - ErrPrint("Failed to open a display\n"); - return WIDGET_ERROR_FAULT; - } - } - - if (info->handle == 0) { - ErrPrint("Pixmap ID is not valid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (info->bufsz == 0) { - /*! - * If the client does not acquire the buffer, - * This function will do nothing. - * It will work only if the buffer is acquired. - * To sync its contents. - */ - DbgPrint("Nothing can be sync\n"); - return WIDGET_ERROR_NONE; - } - - si.shmid = shmget(IPC_PRIVATE, info->bufsz, IPC_CREAT | 0666); - if (si.shmid < 0) { - ErrPrint("shmget: %d\n", errno); - return WIDGET_ERROR_FAULT; - } - - si.readOnly = False; - si.shmaddr = shmat(si.shmid, NULL, 0); - if (si.shmaddr == (void *)-1) { - if (shmctl(si.shmid, IPC_RMID, 0) < 0) { - ErrPrint("shmctl: %d\n", errno); - } - - return WIDGET_ERROR_FAULT; - } - - /*! - * \NOTE - * Use the 24 bits Pixmap for Video player - */ - xim = XShmCreateImage(s_info.disp, s_info.visual, - (info->pixels << 3), ZPixmap, NULL, - &si, - info->w, info->h); - if (xim == NULL) { - if (shmdt(si.shmaddr) < 0) { - ErrPrint("shmdt: %d\n", errno); - } - - if (shmctl(si.shmid, IPC_RMID, 0) < 0) { - ErrPrint("shmctl: %d\n", errno); - } - - return WIDGET_ERROR_FAULT; - } - - xim->data = si.shmaddr; - XShmAttach(s_info.disp, &si); - - XShmGetImage(s_info.disp, info->handle, xim, 0, 0, 0xFFFFFFFF); - XSync(s_info.disp, False); - - if (x != 0 || y != 0 || info->w != w || info->h != h) { - int ix; - int iy; - register int index; - - for (iy = y; iy < h; iy++) { - for (ix = x; ix < w; ix++) { - index = iy * info->w + x; - *(((unsigned int *)buffer->data) + index) = *(((unsigned int *)xim->data) + index); - } - } - } else { - memcpy(buffer->data, xim->data, info->bufsz); - } - - XShmDetach(s_info.disp, &si); - XDestroyImage(xim); - - if (shmdt(si.shmaddr) < 0) { - ErrPrint("shmdt: %d\n", errno); - } - - if (shmctl(si.shmid, IPC_RMID, 0) < 0) { - ErrPrint("shmctl: %d\n", errno); - } - - return WIDGET_ERROR_NONE; -} - -int fb_sync(struct fb_info *info, int x, int y, int w, int h) -{ - if (!info) { - ErrPrint("FB Handle is not valid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!info->id || info->id[0] == '\0') { - DbgPrint("Ingore sync\n"); - return WIDGET_ERROR_NONE; - } - - if (!strncasecmp(info->id, SCHEMA_FILE, strlen(SCHEMA_FILE))) { - return sync_for_file(info, x, y, w, h); - } else if (!strncasecmp(info->id, SCHEMA_PIXMAP, strlen(SCHEMA_PIXMAP))) { - return sync_for_pixmap(info, x, y, w, h); - } else if (!strncasecmp(info->id, SCHEMA_SHM, strlen(SCHEMA_SHM))) { - /* No need to do sync */ - return WIDGET_ERROR_NONE; - } - - return WIDGET_ERROR_INVALID_PARAMETER; -} - -struct fb_info *fb_create(const char *id, int w, int h) -{ - struct fb_info *info; - - if (!id || id[0] == '\0') { - ErrPrint("Invalid ID\n"); - return NULL; - } - - info = calloc(1, sizeof(*info)); - if (!info) { - ErrPrint("Heap: %d\n", errno); - return NULL; - } - - info->id = strdup(id); - if (!info->id) { - ErrPrint("Heap: %d\n", errno); - free(info); - return NULL; - } - - info->pixels = sizeof(int); /* Use the default pixels(depth) */ - - if (sscanf(info->id, SCHEMA_SHM "%d", &info->handle) == 1) { - DbgPrint("SHMID: %d is gotten\n", info->handle); - } else if (sscanf(info->id, SCHEMA_PIXMAP "%d:%d", &info->handle, &info->pixels) == 2) { - DbgPrint("PIXMAP-SHMID: %d is gotten (%d)\n", info->handle, info->pixels); - } else { - info->handle = WIDGET_ERROR_INVALID_PARAMETER; - } - - info->bufsz = 0; - info->buffer = NULL; - info->w = w; - info->h = h; - - return info; -} - -int fb_destroy(struct fb_info *info) -{ - if (!info) { - ErrPrint("Handle is not valid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (info->buffer) { - widget_fb_t buffer; - buffer = info->buffer; - - buffer->info = NULL; - } - - free(info->id); - free(info); - return WIDGET_ERROR_NONE; -} - -int fb_is_created(struct fb_info *info) -{ - if (!info) { - ErrPrint("Handle is not valid\n"); - return 0; - } - - if (!strncasecmp(info->id, SCHEMA_PIXMAP, strlen(SCHEMA_PIXMAP)) && info->handle != 0) { - return 1; - } else if (!strncasecmp(info->id, SCHEMA_SHM, strlen(SCHEMA_SHM)) && info->handle > 0) { - return 1; - } else { - const char *path; - path = util_uri_to_path(info->id); - if (path && access(path, F_OK | R_OK) == 0) { - return 1; - } else { - ErrPrint("access: %d (%s)\n", errno, path); - } - } - - return 0; -} - -void *fb_acquire_buffer(struct fb_info *info) -{ - widget_fb_t buffer; - - if (!info) { - ErrPrint("info == NIL\n"); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return NULL; - } - - if (!info->buffer) { - if (!strncasecmp(info->id, SCHEMA_PIXMAP, strlen(SCHEMA_PIXMAP))) { - update_fb_size(info); - - buffer = calloc(1, sizeof(*buffer) + info->bufsz); - if (!buffer) { - ErrPrint("Heap: %d\n", errno); - set_last_result(WIDGET_ERROR_OUT_OF_MEMORY); - info->bufsz = 0; - return NULL; - } - - buffer->type = WIDGET_FB_TYPE_PIXMAP; - buffer->refcnt = 0; - buffer->state = WIDGET_FB_STATE_CREATED; - buffer->info = info; - info->buffer = buffer; - - /*! - * \note - * Just update from here. - */ - sync_for_pixmap(info, 0, 0, info->w, info->h); - } else if (!strncasecmp(info->id, SCHEMA_FILE, strlen(SCHEMA_FILE))) { - update_fb_size(info); - - buffer = calloc(1, sizeof(*buffer) + info->bufsz); - if (!buffer) { - ErrPrint("Heap: %d\n", errno); - info->bufsz = 0; - set_last_result(WIDGET_ERROR_OUT_OF_MEMORY); - return NULL; - } - - buffer->type = WIDGET_FB_TYPE_FILE; - buffer->refcnt = 0; - buffer->state = WIDGET_FB_STATE_CREATED; - buffer->info = info; - info->buffer = buffer; - - sync_for_file(info, 0, 0, info->w, info->h); - } else if (!strncasecmp(info->id, SCHEMA_SHM, strlen(SCHEMA_SHM))) { - buffer = shmat(info->handle, NULL, 0); - if (buffer == (void *)-1) { - ErrPrint("shmat: %d (%d)\n", errno, info->handle); - set_last_result(WIDGET_ERROR_FAULT); - return NULL; - } - - return buffer->data; - } else { - ErrPrint("Buffer is not created (%s)\n", info->id); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return NULL; - } - } - - buffer = info->buffer; - - switch (buffer->type) { - case WIDGET_FB_TYPE_PIXMAP: - buffer->refcnt++; - break; - case WIDGET_FB_TYPE_FILE: - buffer->refcnt++; - break; - default: - DbgPrint("Unknwon FP: %d\n", buffer->type); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - break; - } - - return buffer->data; -} - -int fb_release_buffer(void *data) -{ - widget_fb_t buffer; - - if (!data) { - ErrPrint("buffer data == NIL\n"); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - buffer = container_of(data, struct widget_fb, data); - - if (buffer->state != WIDGET_FB_STATE_CREATED) { - ErrPrint("Invalid handle\n"); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - switch (buffer->type) { - case WIDGET_FB_TYPE_SHM: - if (shmdt(buffer) < 0) { - ErrPrint("shmdt: %d\n", errno); - } - break; - case WIDGET_FB_TYPE_PIXMAP: - buffer->refcnt--; - if (buffer->refcnt == 0) { - struct fb_info *info; - info = buffer->info; - - buffer->state = WIDGET_FB_STATE_DESTROYED; - - if (info && info->buffer == buffer) { - info->buffer = NULL; - } - free(buffer); - } - break; - case WIDGET_FB_TYPE_FILE: - buffer->refcnt--; - if (buffer->refcnt == 0) { - struct fb_info *info; - info = buffer->info; - - buffer->state = WIDGET_FB_STATE_DESTROYED; - - if (info && info->buffer == buffer) { - info->buffer = NULL; - } - - free(buffer); - } - break; - default: - ErrPrint("Unknwon buffer type\n"); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - break; - } - - return WIDGET_ERROR_NONE; -} - -int fb_refcnt(void *data) -{ - widget_fb_t buffer; - struct shmid_ds buf; - int ret; - - if (!data) { - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - buffer = container_of(data, struct widget_fb, data); - - if (buffer->state != WIDGET_FB_STATE_CREATED) { - ErrPrint("Invalid handle\n"); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - switch (buffer->type) { - case WIDGET_FB_TYPE_SHM: - if (shmctl(buffer->refcnt, IPC_STAT, &buf) < 0) { - ErrPrint("Error: %d\n", errno); - set_last_result(WIDGET_ERROR_FAULT); - return WIDGET_ERROR_FAULT; - } - - ret = buf.shm_nattch; - break; - case WIDGET_FB_TYPE_PIXMAP: - ret = buffer->refcnt; - break; - case WIDGET_FB_TYPE_FILE: - ret = buffer->refcnt; - break; - default: - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - ret = WIDGET_ERROR_INVALID_PARAMETER; - break; - } - - return ret; -} - -const char *fb_id(struct fb_info *info) -{ - return info ? info->id : NULL; -} - -int fb_get_size(struct fb_info *info, int *w, int *h) -{ - if (!info) { - ErrPrint("Handle is not valid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - *w = info->w; - *h = info->h; - return WIDGET_ERROR_NONE; -} - -int fb_size(struct fb_info *info) -{ - if (!info) { - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return 0; - } - - update_fb_size(info); - - return info->bufsz; -} - -int fb_type(struct fb_info *info) -{ - widget_fb_t buffer; - - if (!info) { - return WIDGET_FB_TYPE_ERROR; - } - - buffer = info->buffer; - if (!buffer) { - int type = WIDGET_FB_TYPE_ERROR; - /*! - * \note - * Try to get this from SCHEMA - */ - if (info->id) { - if (!strncasecmp(info->id, SCHEMA_FILE, strlen(SCHEMA_FILE))) { - type = WIDGET_FB_TYPE_FILE; - } else if (!strncasecmp(info->id, SCHEMA_PIXMAP, strlen(SCHEMA_PIXMAP))) { - type = WIDGET_FB_TYPE_PIXMAP; - } else if (!strncasecmp(info->id, SCHEMA_SHM, strlen(SCHEMA_SHM))) { - type = WIDGET_FB_TYPE_SHM; - } - } - - return type; - } - - return buffer->type; -} -/* End of a file */ diff --git a/widget_viewer/src/fb_wayland.c b/widget_viewer/src/fb_wayland.c deleted file mode 100644 index d958515..0000000 --- a/widget_viewer/src/fb_wayland.c +++ /dev/null @@ -1,639 +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 -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include /* For error code */ -#include /* For buffer event data */ -#include -#include - -#include "debug.h" -#include "util.h" -#include "fb.h" -#include "dlist.h" - -int errno; - -struct gem_data { - tbm_bo pixmap_bo; - tbm_bo_handle handle; - widget_fb_t buffer; -}; - -static struct { - struct wl_display *disp; - tbm_bufmgr bufmgr; - int disp_is_opened; - int fd; - struct dlist *canvas_list; -} s_info = { - .disp = NULL, - .bufmgr = NULL, - .disp_is_opened = 0, - .fd = -1, - .canvas_list = NULL, -}; - -int fb_init(void *disp) -{ - int ret; - - s_info.disp = disp; - if (!s_info.disp) { - s_info.disp = wl_display_connect(NULL); - if (!s_info.disp) { - ErrPrint("Failed to open a display\n"); - return WIDGET_ERROR_FAULT; - } - - s_info.disp_is_opened = 1; - } - - ret = widget_util_get_drm_fd(s_info.disp, &s_info.fd); - if (ret != WIDGET_ERROR_NONE || s_info.fd < 0) { - ErrPrint("Failed to open a drm device: (%d)\n", errno); - return WIDGET_ERROR_FAULT; - } - - s_info.bufmgr = tbm_bufmgr_init(s_info.fd); - if (!s_info.bufmgr) { - ErrPrint("Failed to init bufmgr\n"); - widget_util_release_drm_fd(s_info.fd); - s_info.fd = -1; - return WIDGET_ERROR_FAULT; - } - - return WIDGET_ERROR_NONE; -} - -int fb_fini(void) -{ - if (s_info.bufmgr) { - tbm_bufmgr_deinit(s_info.bufmgr); - s_info.bufmgr = NULL; - } - - if (s_info.fd >= 0) { - widget_util_release_drm_fd(s_info.fd); - s_info.fd = -1; - } - - if (s_info.disp_is_opened && s_info.disp) { - wl_display_disconnect(s_info.disp); - s_info.disp = NULL; - } - - s_info.disp = NULL; - return WIDGET_ERROR_NONE; -} - -static inline void update_fb_size(struct fb_info *info) -{ - info->bufsz = info->w * info->h * info->pixels; -} - -static int sync_for_file(struct fb_info *info, int x, int y, int w, int h) -{ - int fd; - widget_fb_t buffer; - const char *path = NULL; - - buffer = info->buffer; - - if (!buffer) { /* Ignore this sync request */ - return WIDGET_ERROR_NONE; - } - - if (buffer->state != WIDGET_FB_STATE_CREATED) { - ErrPrint("Invalid state of a FB\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (buffer->type != WIDGET_FB_TYPE_FILE) { - ErrPrint("Invalid buffer\n"); - return WIDGET_ERROR_NONE; - } - - path = util_uri_to_path(info->id); - - if (path == NULL) { - ErrPrint("Invalid parameter\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - fd = open(path, O_RDONLY); - if (fd < 0) { - ErrPrint("Failed to open a file (%s) because of (%d)\n", - util_uri_to_path(info->id), errno); - - /** - * @note - * But return ZERO, even if we couldn't get a buffer file, - * the viewer can draw empty screen. - * - * and then update it after it gots update events - */ - return WIDGET_ERROR_NONE; - } - - /** - * @note - * Could we get some advantage if we load a part of file instead of loading all of them? - */ - if (x != 0 || y != 0 || info->w != w || info->h != h) { - int iy; - register int index; - register int width; - - for (iy = y; iy < h; iy++) { - index = iy * info->w + x; - width = w * info->pixels; - - if (lseek(fd, index * info->pixels, SEEK_SET) != index * info->pixels) { - ErrPrint("lseek: %d\n", errno); - if (close(fd) < 0) { - ErrPrint("close: %d\n", errno); - } - /** - * @note - * But return ZERO, even if we couldn't get a buffer file, - * the viewer can draw empty screen. - * - * and then update it after it gots update events - */ - return WIDGET_ERROR_NONE; - } - - if (read(fd, ((unsigned int *)buffer->data) + index, width) != width) { - if (close(fd) < 0) { - ErrPrint("close: %d\n", errno); - } - /** - * @note - * But return ZERO, even if we couldn't get a buffer file, - * the viewer can draw empty screen. - * - * and then update it after it gots update events - */ - return WIDGET_ERROR_NONE; - } - } - } else { - if (read(fd, buffer->data, info->bufsz) != info->bufsz) { - ErrPrint("read: %d\n", errno); - if (close(fd) < 0) { - ErrPrint("close: %d\n", errno); - } - - /** - * @note - * But return ZERO, even if we couldn't get a buffer file, - * the viewer can draw empty screen. - * - * and then update it after it gots update events - */ - return WIDGET_ERROR_NONE; - } - } - - if (close(fd) < 0) { - ErrPrint("close: %d\n", errno); - } - return WIDGET_ERROR_NONE; -} - -int fb_sync(struct fb_info *info, int x, int y, int w, int h) -{ - if (!info) { - ErrPrint("FB Handle is not valid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!info->id || info->id[0] == '\0') { - DbgPrint("Ingore sync\n"); - return WIDGET_ERROR_NONE; - } - - if (!strncasecmp(info->id, SCHEMA_FILE, strlen(SCHEMA_FILE))) { - return sync_for_file(info, x, y, w, h); - } else if (!strncasecmp(info->id, SCHEMA_PIXMAP, strlen(SCHEMA_PIXMAP))) { - return WIDGET_ERROR_NONE; - } else if (!strncasecmp(info->id, SCHEMA_SHM, strlen(SCHEMA_SHM))) { - /* No need to do sync */ - return WIDGET_ERROR_NONE; - } - - return WIDGET_ERROR_INVALID_PARAMETER; -} - -struct fb_info *fb_create(const char *id, int w, int h) -{ - struct fb_info *info; - - if (!id || id[0] == '\0') { - ErrPrint("Invalid ID\n"); - return NULL; - } - - info = calloc(1, sizeof(*info)); - if (!info) { - ErrPrint("Heap: %d\n", errno); - return NULL; - } - - info->id = strdup(id); - if (!info->id) { - ErrPrint("Heap: %d\n", errno); - free(info); - return NULL; - } - - info->pixels = sizeof(int); /* Use the default pixels(depth) */ - - if (sscanf(info->id, SCHEMA_SHM "%d", &info->handle) == 1) { - DbgPrint("SHMID: %d is gotten\n", info->handle); - } else if (sscanf(info->id, SCHEMA_PIXMAP "%d:%d", &info->handle, &info->pixels) == 2) { - DbgPrint("PIXMAP-SHMID: %d is gotten (%d)\n", info->handle, info->pixels); - } else { - info->handle = WIDGET_ERROR_INVALID_PARAMETER; - } - - info->bufsz = 0; - info->buffer = NULL; - info->w = w; - info->h = h; - - return info; -} - -int fb_destroy(struct fb_info *info) -{ - if (!info) { - ErrPrint("Handle is not valid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (info->buffer) { - widget_fb_t buffer; - buffer = info->buffer; - - buffer->info = NULL; - } - - free(info->id); - free(info); - return WIDGET_ERROR_NONE; -} - -int fb_is_created(struct fb_info *info) -{ - if (!info) { - ErrPrint("Handle is not valid\n"); - return 0; - } - - if (!strncasecmp(info->id, SCHEMA_PIXMAP, strlen(SCHEMA_PIXMAP)) && info->handle != 0) { - return 1; - } else if (!strncasecmp(info->id, SCHEMA_SHM, strlen(SCHEMA_SHM)) && info->handle > 0) { - return 1; - } else { - const char *path; - path = util_uri_to_path(info->id); - if (path && access(path, F_OK | R_OK) == 0) { - return 1; - } else { - ErrPrint("access: %d (%s)\n", errno, path); - } - } - - return 0; -} - -void *fb_acquire_buffer(struct fb_info *info) -{ - widget_fb_t buffer; - - if (!info) { - ErrPrint("info == NIL\n"); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return NULL; - } - - if (!info->buffer) { - if (!strncasecmp(info->id, SCHEMA_PIXMAP, strlen(SCHEMA_PIXMAP))) { - struct gem_data *gem; - - update_fb_size(info); - - buffer = calloc(1, sizeof(*buffer) + info->bufsz); - if (!buffer) { - ErrPrint("Heap: %d\n", errno); - set_last_result(WIDGET_ERROR_OUT_OF_MEMORY); - info->bufsz = 0; - return NULL; - } - - gem = calloc(1, sizeof(*gem)); - if (!gem) { - ErrPrint("Heap: %d\n", errno); - return NULL; - } - - buffer->type = WIDGET_FB_TYPE_PIXMAP; - buffer->refcnt = 0; - buffer->state = WIDGET_FB_STATE_CREATED; - buffer->info = info; - info->buffer = buffer; - info->gem = gem; - - gem->pixmap_bo = tbm_bo_import(s_info.bufmgr, info->handle); - if (!gem->pixmap_bo) { - ErrPrint("Failed to get bo\n"); - free(gem); - free(buffer); - return NULL; - } - - gem->handle = tbm_bo_map(gem->pixmap_bo, TBM_DEVICE_CPU, TBM_OPTION_READ); - gem->buffer = buffer; - - s_info.canvas_list = dlist_append(s_info.canvas_list, buffer); - } else if (!strncasecmp(info->id, SCHEMA_FILE, strlen(SCHEMA_FILE))) { - update_fb_size(info); - - buffer = calloc(1, sizeof(*buffer) + info->bufsz); - if (!buffer) { - ErrPrint("Heap: %d\n", errno); - info->bufsz = 0; - set_last_result(WIDGET_ERROR_OUT_OF_MEMORY); - return NULL; - } - - buffer->type = WIDGET_FB_TYPE_FILE; - buffer->refcnt = 0; - buffer->state = WIDGET_FB_STATE_CREATED; - buffer->info = info; - info->buffer = buffer; - - sync_for_file(info, 0, 0, info->w, info->h); - } else if (!strncasecmp(info->id, SCHEMA_SHM, strlen(SCHEMA_SHM))) { - buffer = shmat(info->handle, NULL, 0); - if (buffer == (void *)-1) { - ErrPrint("shmat: %d (%d)\n", errno, info->handle); - set_last_result(WIDGET_ERROR_FAULT); - return NULL; - } - - return buffer->data; - } else { - ErrPrint("Buffer is not created (%s)\n", info->id); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return NULL; - } - } - - buffer = info->buffer; - - switch (buffer->type) { - case WIDGET_FB_TYPE_PIXMAP: - { - struct gem_data *gem; - - buffer->refcnt++; - gem = info->gem; - - return gem->handle.ptr; - } - break; - case WIDGET_FB_TYPE_FILE: - buffer->refcnt++; - break; - default: - DbgPrint("Unknwon FP: %d\n", buffer->type); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - break; - } - - return buffer->data; -} - -int fb_release_buffer(void *data) -{ - widget_fb_t buffer; - struct dlist *l; - - if (!data) { - ErrPrint("buffer data == NIL\n"); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - buffer = NULL; - dlist_foreach(s_info.canvas_list, l, buffer) { - if (buffer) { - struct fb_info *info; - struct gem_data *gem; - - info = buffer->info; - gem = info->gem; - - if (gem->handle.ptr == data) { - break; - } - } - buffer = NULL; - } - - if (!buffer) { - buffer = container_of(data, struct widget_fb, data); - } - - if (buffer->state != WIDGET_FB_STATE_CREATED) { - ErrPrint("Invalid handle\n"); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - switch (buffer->type) { - case WIDGET_FB_TYPE_SHM: - if (shmdt(buffer) < 0) { - ErrPrint("shmdt: %d\n", errno); - } - break; - case WIDGET_FB_TYPE_PIXMAP: - buffer->refcnt--; - if (buffer->refcnt == 0) { - struct fb_info *info; - struct gem_data *gem; - - info = buffer->info; - gem = info->gem; - - if (gem->pixmap_bo) { - tbm_bo_unmap(gem->pixmap_bo); - gem->pixmap_bo = NULL; - } - - dlist_remove_data(s_info.canvas_list, buffer); - free(gem); - free(buffer); - } - break; - case WIDGET_FB_TYPE_FILE: - buffer->refcnt--; - if (buffer->refcnt == 0) { - struct fb_info *info; - info = buffer->info; - - buffer->state = WIDGET_FB_STATE_DESTROYED; - - if (info && info->buffer == buffer) { - info->buffer = NULL; - } - - free(buffer); - } - break; - default: - ErrPrint("Unknwon buffer type\n"); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - break; - } - - return WIDGET_ERROR_NONE; -} - -int fb_refcnt(void *data) -{ - widget_fb_t buffer; - struct shmid_ds buf; - int ret; - - if (!data) { - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - buffer = container_of(data, struct widget_fb, data); - - if (buffer->state != WIDGET_FB_STATE_CREATED) { - ErrPrint("Invalid handle\n"); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - switch (buffer->type) { - case WIDGET_FB_TYPE_SHM: - if (shmctl(buffer->refcnt, IPC_STAT, &buf) < 0) { - ErrPrint("Error: %d\n", errno); - set_last_result(WIDGET_ERROR_FAULT); - return WIDGET_ERROR_FAULT; - } - - ret = buf.shm_nattch; - break; - case WIDGET_FB_TYPE_PIXMAP: - ret = buffer->refcnt; - break; - case WIDGET_FB_TYPE_FILE: - ret = buffer->refcnt; - break; - default: - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - ret = WIDGET_ERROR_INVALID_PARAMETER; - break; - } - - return ret; -} - -const char *fb_id(struct fb_info *info) -{ - return info ? info->id : NULL; -} - -int fb_get_size(struct fb_info *info, int *w, int *h) -{ - if (!info) { - ErrPrint("Handle is not valid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - *w = info->w; - *h = info->h; - return WIDGET_ERROR_NONE; -} - -int fb_size(struct fb_info *info) -{ - if (!info) { - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return 0; - } - - update_fb_size(info); - - return info->bufsz; -} - -int fb_type(struct fb_info *info) -{ - widget_fb_t buffer; - - if (!info) { - return WIDGET_FB_TYPE_ERROR; - } - - buffer = info->buffer; - if (!buffer) { - int type = WIDGET_FB_TYPE_ERROR; - /*! - * \note - * Try to get this from SCHEMA - */ - if (info->id) { - if (!strncasecmp(info->id, SCHEMA_FILE, strlen(SCHEMA_FILE))) { - type = WIDGET_FB_TYPE_FILE; - } else if (!strncasecmp(info->id, SCHEMA_PIXMAP, strlen(SCHEMA_PIXMAP))) { - type = WIDGET_FB_TYPE_PIXMAP; - } else if (!strncasecmp(info->id, SCHEMA_SHM, strlen(SCHEMA_SHM))) { - type = WIDGET_FB_TYPE_SHM; - } - } - - return type; - } - - return buffer->type; -} - -/* End of a file */ diff --git a/widget_viewer/src/file_service.c b/widget_viewer/src/file_service.c deleted file mode 100644 index 1beeb30..0000000 --- a/widget_viewer/src/file_service.c +++ /dev/null @@ -1,715 +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. - */ - -#define _GNU_SOURCE - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include - -#include "client.h" -#include "debug.h" -#include "dlist.h" - -#define FILE_SERVICE_PORT 8209 - -#define CRITICAL_SECTION_BEGIN(handle) \ - do { \ - int ret; \ - ret = pthread_mutex_lock(handle); \ - if (ret != 0) { \ - ErrPrint("Failed to lock: %s\n", strerror(ret)); \ - } \ - } while (0) - -#define CRITICAL_SECTION_END(handle) \ - do { \ - int ret; \ - ret = pthread_mutex_unlock(handle); \ - if (ret != 0) { \ - ErrPrint("Failed to unlock: %s\n", strerror(ret)); \ - } \ - } while (0) - -#define CANCEL_SECTION_BEGIN() do { \ - int ret; \ - ret = pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); \ - if (ret != 0) { \ - ErrPrint("Unable to set cancelate state: %s\n", strerror(ret)); \ - } \ -} while (0) - -#define CANCEL_SECTION_END() do { \ - int ret; \ - ret = pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL); \ - if (ret != 0) { \ - ErrPrint("Unable to set cancelate state: %s\n", strerror(ret)); \ - } \ -} while (0) - -#define CLOSE_PIPE(p) do { \ - int status; \ - status = close(p[PIPE_READ]); \ - if (status < 0) { \ - ErrPrint("close: %d\n", errno); \ - } \ - status = close(p[PIPE_WRITE]); \ - if (status < 0) { \ - ErrPrint("close: %d\n", errno); \ - } \ -} while (0) - -#define PIPE_READ 0 -#define PIPE_WRITE 1 -#define PIPE_MAX 2 - -#define EVT_END_CH 'c' -#define EVT_CH 'e' - -static struct { - pthread_t file_svc_thid; - pthread_mutex_t file_svc_lock; - int ctrl_pipe[PIPE_MAX]; - int evt_pipe[PIPE_MAX]; - struct dlist *request_list; - int file_service_fd; -} s_info = { - .ctrl_pipe = { -1, -1 }, - .evt_pipe = { -1, -1 }, - .request_list = NULL, - .file_service_fd = -1, -}; - -struct request_item { - char *filename; - char *save_to; - void (*result_cb)(const char *filename, const char *save_to, int ret, void *data); - void *data; - int ret; -}; - -/*! - * File transfer header. - * This must should be shared with client. - */ -struct burst_head { - off_t size; - int flen; - char fname[]; -}; - -struct burst_data { - int size; - char data[]; -}; - -static inline int put_event_ch(int fd, char ch) -{ - int ret; - - ret = write(fd, &ch, sizeof(ch)); - if (ret != sizeof(ch)) { - ErrPrint("write: %d\n", errno); - return ret; - } - - return 0; -} - -static inline int get_event_ch(int fd) -{ - int ret; - char ch; - - ret = read(fd, &ch, sizeof(ch)); - if (ret != sizeof(ch)) { - ErrPrint("read: %d\n", errno); - return ret; - } - - ret = (int)((unsigned int)ch); - return ret; -} - -static inline int file_service_close(int fd) -{ - return secure_socket_destroy_handle(fd); -} - -static inline int file_service_open(void) -{ - char *addr; - int port; - char *file_addr; - int len; - int fd; - - addr = malloc(strlen(client_addr()) + 1); - if (!addr) { - ErrPrint("Heap: %d\n", errno); - return -ENOMEM; - } - - if (sscanf(client_addr(), COM_CORE_REMOTE_SCHEME"%[^:]:%d", addr, &port) != 2) { - ErrPrint("Invalid URL\n"); - free(addr); - return -EINVAL; - } - - len = strlen(COM_CORE_REMOTE_SCHEME); - len += strlen(addr); - len += 6; /* Port length? */ - - file_addr = malloc(len); - if (!file_addr) { - ErrPrint("Heap: %d\n", errno); - free(addr); - return -ENOMEM; - } - - snprintf(file_addr, len, COM_CORE_REMOTE_SCHEME"%s:%d", addr, FILE_SERVICE_PORT); - DbgPrint("File service: %s\n", file_addr); - fd = secure_socket_create_client(file_addr); - free(file_addr); - free(addr); - - return fd; -} - -/*! - * Service Thread - */ -static void write_item_to_pipe(struct request_item *item, int ret) -{ - item->ret = WIDGET_ERROR_FAULT; - if (write(s_info.evt_pipe[PIPE_WRITE], &item, sizeof(item)) != sizeof(item)) { - ErrPrint("write: %d\n", errno); - free(item->filename); - free(item->save_to); - free(item); - item = NULL; - } -} - -/*! - * Service Thread - */ -static void *file_service_main(void *data) -{ - int ret = 0; - int select_fd; - struct timeval tv; - fd_set set; - int offset; - enum { - RECV_INIT, - RECV_HEADER, - RECV_DATA, - } recv_state; - struct burst_head *head; - struct burst_data *body; - int recvsz; - struct request_item *item; - int file_offset; - int file_fd; - - head = NULL; - item = NULL; - recv_state = RECV_INIT; - select_fd = (s_info.file_service_fd > s_info.ctrl_pipe[PIPE_READ] ? s_info.file_service_fd : s_info.ctrl_pipe[PIPE_READ]) + 1; - while (ret == 0) { - FD_ZERO(&set); - FD_SET(s_info.file_service_fd, &set); - FD_SET(s_info.ctrl_pipe[PIPE_READ], &set); - - tv.tv_sec = 3; - tv.tv_usec = 0; - ret = select(select_fd , &set, NULL, NULL, &tv); - if (ret < 0) { - ret = -errno; - if (errno == EINTR) { - ErrPrint("INTERRUPTED\n"); - ret = 0; - continue; - } - ErrPrint("Error: %d\n", errno); - break; - } else if (ret == 0) { - ErrPrint("Timeout\n"); - ret = -ETIMEDOUT; - break; - } - - if (item && FD_ISSET(s_info.file_service_fd, &set)) { - switch (recv_state) { - case RECV_INIT: - if (head == NULL) { - recvsz = sizeof(*head); - - head = malloc(recvsz); - if (!head) { - ErrPrint("Heap: %d\n", errno); - ret = WIDGET_ERROR_OUT_OF_MEMORY; - write_item_to_pipe(item, ret); - item = NULL; - break; - } - - offset = 0; - recv_state = RECV_HEADER; - } - case RECV_HEADER: - if (offset < recvsz) { - ret = secure_socket_recv(s_info.file_service_fd, (char *)head + offset, recvsz - offset, NULL); - if (ret > 0) { - offset += ret; - } else { - free(head); - head = NULL; - recv_state = RECV_INIT; - ret = WIDGET_ERROR_FAULT; - write_item_to_pipe(item, ret); - item = NULL; - break; - } - } - - if (offset == sizeof(*head)) { - void *tmp; - - recvsz += head->flen; - - tmp = realloc(head, recvsz); - if (!tmp) { - ErrPrint("Heap: %d\n", errno); - - free(head); - head = NULL; - recv_state = RECV_INIT; - - ret = WIDGET_ERROR_OUT_OF_MEMORY; - write_item_to_pipe(item, ret); - item = NULL; - break; - } - - head = tmp; - } else if (offset == recvsz) { - DbgPrint("Filesize: %d, name[%s]\n", head->size, head->fname); - if (strcmp(item->filename, head->fname)) { - ErrPrint("Invalid data sequence (%s <> %s)\n", item->filename, head->fname); - - free(head); - head = NULL; - recv_state = RECV_INIT; - ret = WIDGET_ERROR_FAULT; - write_item_to_pipe(item, ret); - item = NULL; - break; - } - - file_fd = open(item->save_to, O_WRONLY|O_CREAT, 0644); - if (file_fd < 0) { - ErrPrint("open: %d\n", errno); - free(head); - head = NULL; - recv_state = RECV_INIT; - - ret = WIDGET_ERROR_IO_ERROR; - write_item_to_pipe(item, ret); - item = NULL; - break; - } - - recv_state = RECV_DATA; - body = NULL; - - } else { - ErrPrint("Invalid state\n"); - free(head); - head = NULL; - recv_state = RECV_INIT; - ret = WIDGET_ERROR_INVALID_PARAMETER; - write_item_to_pipe(item, ret); - item = NULL; - } - break; - case RECV_DATA: - if (!body) { - body = malloc(sizeof(*body)); - if (!body) { - free(head); - head = NULL; - recv_state = RECV_INIT; - ret = WIDGET_ERROR_OUT_OF_MEMORY; - write_item_to_pipe(item, ret); - item = NULL; - break; - } - - recvsz = sizeof(*body); - offset = 0; - } - - ret = secure_socket_recv(s_info.file_service_fd, (char *)body + offset, recvsz - offset, NULL); - if (ret > 0) { - offset += ret; - } else { - free(head); - head = NULL; - free(body); - body = NULL; - recv_state = RECV_INIT; - ret = WIDGET_ERROR_FAULT; - write_item_to_pipe(item, ret); - item = NULL; - break; - } - - if (offset == sizeof(*body)) { - void *tmp; - - if (body->size < 0) { - ErrPrint("body->size: %d\n", body->size); - free(head); - head = NULL; - free(body); - body = NULL; - recv_state = RECV_INIT; - ret = WIDGET_ERROR_FAULT; - write_item_to_pipe(item, ret); - item = NULL; - break; - } - - recvsz += body->size; - - tmp = realloc(body, recvsz); - if (!tmp) { - ErrPrint("Heap: %d\n", errno); - free(head); - head = NULL; - - free(body); - body = NULL; - recv_state = RECV_INIT; - - ret = WIDGET_ERROR_OUT_OF_MEMORY; - write_item_to_pipe(item, ret); - item = NULL; - break; - } - } else if (offset == recvsz) { - /* Flush this to the file */ - ret = write(file_fd, body->data, body->size); - if (ret < 0) { - ErrPrint("write: %d\n", errno); - free(head); - head = NULL; - - free(body); - body = NULL; - recv_state = RECV_INIT; - - ret = WIDGET_ERROR_IO_ERROR; - write_item_to_pipe(item, ret); - item = NULL; - break; - } else { - if (body->size != ret) { - DbgPrint("Body is not flushed correctly: %d, %d\n", ret, body->size); - ret = body->size; - } - - file_offset += ret; - if (file_offset == head->size) { - if (close(file_fd) < 0) { - ErrPrint("close: %d\n", errno); - } - ret = WIDGET_ERROR_NONE; - write_item_to_pipe(item, ret); - item = NULL; - } - } - - free(body); - body = NULL; - - free(head); - head = NULL; - - recv_state = RECV_INIT; - } else { - ErrPrint("Invalid state\n"); - - ret = -EFAULT; - free(body); - body = NULL; - free(head); - head = NULL; - recv_state = RECV_INIT; - - ret = WIDGET_ERROR_FAULT; - write_item_to_pipe(item, ret); - item = NULL; - } - break; - default: - ErrPrint("Unknown event: %d\n", recv_state); - ret = WIDGET_ERROR_FAULT; - write_item_to_pipe(item, ret); - item = NULL; - break; - } - } else if (item == NULL && recv_state == RECV_INIT && FD_ISSET(s_info.ctrl_pipe[PIPE_READ], &set)) { - int ch; - struct dlist *l; - - /* Only if the recv state is not changed, we can get next request item */ - ch = get_event_ch(s_info.ctrl_pipe[PIPE_READ]); - if (ch == EVT_END_CH) { - DbgPrint("Service thread is canceled\n"); - break; - } - - CRITICAL_SECTION_BEGIN(&s_info.file_svc_lock); - l = dlist_nth(s_info.request_list, 0); - item = dlist_data(l); - s_info.request_list = dlist_remove(s_info.request_list, l); - CRITICAL_SECTION_END(&s_info.file_svc_lock); - } - } - - return (void *)((long)ret); -} - -/* Master */ -static gboolean evt_cb(GIOChannel *src, GIOCondition cond, gpointer data) -{ - int fd; - struct request_item *item; - - fd = g_io_channel_unix_get_fd(src); - - if (!(cond & G_IO_IN)) { - DbgPrint("Client is disconencted\n"); - return FALSE; - } - - if ((cond & G_IO_ERR) || (cond & G_IO_HUP) || (cond & G_IO_NVAL)) { - DbgPrint("Client connection is lost\n"); - return FALSE; - } - - if (read(fd, &item, sizeof(item)) != sizeof(item)) { - ErrPrint("read: %d\n", errno); - } else { - if (item->result_cb) { - item->result_cb(item->filename, item->save_to, item->ret, item->data); - } - - free(item->filename); - free(item->save_to); - free(item); - } - - return TRUE; -} - -int file_service_send_request(const char *filename, const char *save_to, void (*result_cb)(const char *filename, const char *save_to, int ret, void *data), void *data) -{ - struct request_item *item; - - item = malloc(sizeof(*item)); - if (!item) { - ErrPrint("Heap: %d\n", errno); - return -ENOMEM; - } - - item->filename = strdup(filename); - if (!item->filename) { - ErrPrint("Heap: %d\n", errno); - free(item); - return -ENOMEM; - } - - item->save_to = strdup(save_to); - if (!item->save_to) { - ErrPrint("Heap: %d\n", errno); - free(item->filename); - free(item); - return -ENOMEM; - } - - item->result_cb = result_cb; - item->data = data; - - CRITICAL_SECTION_BEGIN(&s_info.file_svc_lock); - s_info.request_list = dlist_append(s_info.request_list, item); - CRITICAL_SECTION_END(&s_info.file_svc_lock); - return 0; -} - -int file_service_init(void) -{ - int status; - GIOChannel *gio; - guint id; - - if (strncmp(client_addr(), COM_CORE_REMOTE_SCHEME, strlen(COM_CORE_REMOTE_SCHEME))) { - return 0; - } - - s_info.file_service_fd = file_service_open(); - if (s_info.file_service_fd < 0) { - return -EFAULT; - } - - if (pipe2(s_info.ctrl_pipe, O_NONBLOCK | O_CLOEXEC) < 0) { - ErrPrint("file service: %d\n", errno); - file_service_close(s_info.file_service_fd); - s_info.file_service_fd = -1; - return -EFAULT; - } - - if (pipe2(s_info.evt_pipe, O_NONBLOCK | O_CLOEXEC) < 0) { - ErrPrint("file service: %d\n", errno); - CLOSE_PIPE(s_info.ctrl_pipe); - file_service_close(s_info.file_service_fd); - s_info.file_service_fd = -1; - return -EFAULT; - } - - status = pthread_mutex_init(&s_info.file_svc_lock, NULL); - if (status != 0) { - ErrPrint("Mutex: %s\n", strerror(status)); - CLOSE_PIPE(s_info.ctrl_pipe); - CLOSE_PIPE(s_info.evt_pipe); - file_service_close(s_info.file_service_fd); - s_info.file_service_fd = -1; - return -EFAULT; - } - - gio = g_io_channel_unix_new(s_info.evt_pipe[PIPE_READ]); - if (!gio) { - ErrPrint("io channel new\n"); - status = pthread_mutex_destroy(&s_info.file_svc_lock); - if (status != 0) { - ErrPrint("destroy: %s\n", strerror(status)); - } - CLOSE_PIPE(s_info.ctrl_pipe); - CLOSE_PIPE(s_info.evt_pipe); - file_service_close(s_info.file_service_fd); - s_info.file_service_fd = -1; - return -EFAULT; - } - - g_io_channel_set_close_on_unref(gio, FALSE); - - id = g_io_add_watch(gio, G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL, (GIOFunc)evt_cb, NULL); - if (id <= 0) { - GError *err = NULL; - ErrPrint("Failed to add IO watch\n"); - g_io_channel_shutdown(gio, TRUE, &err); - if (err) { - ErrPrint("Shutdown: %s\n", err->message); - g_error_free(err); - } - g_io_channel_unref(gio); - - status = pthread_mutex_destroy(&s_info.file_svc_lock); - if (status != 0) { - ErrPrint("destroy: %s\n", strerror(status)); - } - CLOSE_PIPE(s_info.ctrl_pipe); - CLOSE_PIPE(s_info.evt_pipe); - file_service_close(s_info.file_service_fd); - s_info.file_service_fd = -1; - return -EIO; - } - - status = pthread_create(&s_info.file_svc_thid, NULL, file_service_main, NULL); - if (status != 0) { - GError *err = NULL; - ErrPrint("Failed to add IO watch\n"); - g_io_channel_shutdown(gio, TRUE, &err); - if (err) { - ErrPrint("Shutdown: %s\n", err->message); - g_error_free(err); - } - g_io_channel_unref(gio); - - ErrPrint("file service: %s\n", strerror(status)); - CLOSE_PIPE(s_info.ctrl_pipe); - CLOSE_PIPE(s_info.evt_pipe); - file_service_close(s_info.file_service_fd); - s_info.file_service_fd = -1; - - status = pthread_mutex_destroy(&s_info.file_svc_lock); - if (status != 0) { - ErrPrint("destroy: %s\n", strerror(status)); - } - - return -EFAULT; - } - - g_io_channel_unref(gio); - return 0; -} - -int file_service_fini(void) -{ - void *svc_ret; - int ret; - - if (strncmp(client_addr(), COM_CORE_REMOTE_SCHEME, strlen(COM_CORE_REMOTE_SCHEME))) { - return 0; - } - - (void)put_event_ch(s_info.ctrl_pipe[PIPE_WRITE], EVT_END_CH); - - ret = pthread_join(s_info.file_svc_thid, &svc_ret); - if (ret != 0) { - ErrPrint("join: %s\n", strerror(ret)); - } else { - DbgPrint("file svc returns: %p\n", svc_ret); - } - - ret = pthread_mutex_destroy(&s_info.file_svc_lock); - if (ret != 0) { - ErrPrint("destroy: %s\n", strerror(ret)); - } - - CLOSE_PIPE(s_info.evt_pipe); - CLOSE_PIPE(s_info.ctrl_pipe); - - return 0; -} - -/* End of a file */ diff --git a/widget_viewer/src/master_rpc.c b/widget_viewer/src/master_rpc.c deleted file mode 100644 index 3457ebc..0000000 --- a/widget_viewer/src/master_rpc.c +++ /dev/null @@ -1,319 +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 -#include - -#include - -#include -#include -#include -#include -#include -#include - -#include "debug.h" -#include "dlist.h" -#include "widget_viewer.h" -#include "widget_viewer_internal.h" -#include "master_rpc.h" -#include "client.h" -#include "util.h" - -#define DEFAULT_TTL 10 -#define REQUEST_DELAY 10 - -struct command { - int ttl; - struct packet *packet; - widget_h handler; - void (*ret_cb)(widget_h handler, const struct packet *result, void *data); - void *data; - enum { - TYPE_ACK, - TYPE_NOACK - } type; -}; - -int errno; - -static struct { - guint cmd_timer; - struct dlist *cmd_list; -} s_info = { - .cmd_timer = 0, - .cmd_list = NULL, -}; - -static int done_cb(pid_t pid, int handle, const struct packet *packet, void *data); - -static inline struct command *pop_command(void) -{ - struct dlist *l; - struct command *command; - - l = dlist_nth(s_info.cmd_list, 0); - if (!l) { - return NULL; - } - - command = dlist_data(l); - s_info.cmd_list = dlist_remove(s_info.cmd_list, l); - return command; -} - -static inline struct command *create_command(widget_h handler, struct packet *packet) -{ - struct command *command; - - command = malloc(sizeof(*command)); - if (!command) { - ErrPrint("Failed to allocate mem for command\n"); - return NULL; - } - - command->handler = _widget_ref(handler); - command->packet = packet_ref(packet); - return command; -} - -static inline void destroy_command(struct command *command) -{ - packet_unref(command->packet); - _widget_unref(command->handler, 1); - free(command); -} - -static gboolean cmd_consumer(gpointer user_data) -{ - struct command *command; - - command = pop_command(); - if (!command) { - s_info.cmd_timer = 0; - return FALSE; - } - - /*! - * \NOTE: - * Item will be deleted in the "done_cb" - * - * item->param be release by the g_dbus_proxy_call - * so to use it again from the done_cb function, - * increate the reference counter of the item->param - */ - if (command->type == TYPE_NOACK) { - if (com_core_packet_send_only(client_fd(), command->packet) < 0) { - ErrPrint("Failed to send a packet to master\n"); - } - - destroy_command(command); - } else { - if (com_core_packet_async_send(client_fd(), command->packet, 0u, done_cb, command) < 0) { - ErrPrint("Failed to send a packet to master\n"); - if (command->ret_cb) { - command->ret_cb(command->handler, NULL, command->data); - } - destroy_command(command); - } - } - return TRUE; -} - -static inline void prepend_command(struct command *command) -{ - s_info.cmd_list = dlist_prepend(s_info.cmd_list, command); - master_rpc_check_and_fire_consumer(); -} - -void master_rpc_check_and_fire_consumer(void) -{ - if (!s_info.cmd_list || s_info.cmd_timer || client_fd() < 0) { - return; - } - - s_info.cmd_timer = g_timeout_add(REQUEST_DELAY, cmd_consumer, NULL); - if (!s_info.cmd_timer) { - ErrPrint("Failed to add timer\n"); - } -} - -static int done_cb(pid_t pid, int handle, const struct packet *packet, void *data) -{ - struct command *command; - int ret; - - command = data; - - if (!packet) { - /*! \NOTE: - * Release resource even if - * we failed to finish the method call - */ - command->ttl--; - if (command->ttl > 0) { - prepend_command(command); - return 0; - } - - goto out; - } - - if (packet_get(packet, "i", &ret) != 1) { - ErrPrint("Invalid result packet\n"); - ret = WIDGET_ERROR_INVALID_PARAMETER; - } - -out: - if (command->ret_cb) { - command->ret_cb(command->handler, packet, command->data); - } - - destroy_command(command); - return 0; -} - -static inline void push_command(struct command *command) -{ - s_info.cmd_list = dlist_append(s_info.cmd_list, command); - master_rpc_check_and_fire_consumer(); -} - -/*! - * \note - * "handler" could be NULL - */ -int master_rpc_async_request(widget_h handler, struct packet *packet, int urgent, void (*ret_cb)(widget_h handler, const struct packet *result, void *data), void *data) -{ - struct command *command; - - command = create_command(handler, packet); - if (!command) { - ErrPrint("Failed to create a command\n"); - packet_unref(packet); - return WIDGET_ERROR_FAULT; - } - - command->ret_cb = ret_cb; - command->data = data; - command->ttl = DEFAULT_TTL; - command->type = TYPE_ACK; - - if (urgent) { - prepend_command(command); - } else { - push_command(command); - } - - packet_unref(packet); - return WIDGET_ERROR_NONE; -} - -int master_rpc_request_only(widget_h handler, struct packet *packet) -{ - struct command *command; - - command = create_command(handler, packet); - if (!command) { - ErrPrint("Failed to create a command\n"); - packet_unref(packet); - return WIDGET_ERROR_FAULT; - } - - command->ret_cb = NULL; - command->data = NULL; - command->ttl = 0; - command->type = TYPE_NOACK; - - push_command(command); - packet_unref(packet); - return WIDGET_ERROR_NONE; -} - -int master_rpc_clear_fault_package(const char *pkgname) -{ - struct dlist *l; - struct dlist *n; - struct command *command; - - if (!pkgname) { - return WIDGET_ERROR_INVALID_PARAMETER; - } - - dlist_foreach_safe(s_info.cmd_list, l, n, command) { - if (!command->handler) { - continue; - } - - if (!strcmp(command->handler->common->pkgname, pkgname)) { - s_info.cmd_list = dlist_remove(s_info.cmd_list, l); - if (command->ret_cb) { - command->ret_cb(command->handler, NULL, command->data); - } - - destroy_command(command); - } - } - - return 0; -} - -int master_rpc_clear_all_request(void) -{ - struct command *command; - struct dlist *l; - struct dlist *n; - - dlist_foreach_safe(s_info.cmd_list, l, n, command) { - s_info.cmd_list = dlist_remove(s_info.cmd_list, l); - - if (command->ret_cb) { - command->ret_cb(command->handler, NULL, command->data); - } - - destroy_command(command); - } - - return 0; -} - -int master_rpc_sync_request(struct packet *packet) -{ - struct packet *result; - int ret; - - result = com_core_packet_oneshot_send(client_addr(), packet, 0.0f); - if (result) { - if (packet_get(result, "i", &ret) != 1) { - ErrPrint("Invalid result packet\n"); - ret = WIDGET_ERROR_INVALID_PARAMETER; - } - - packet_unref(result); - } else { - ErrPrint("Failed to send a sync request\n"); - ret = WIDGET_ERROR_FAULT; - } - - packet_unref(packet); - return ret; -} - -/* End of a file */ diff --git a/widget_viewer/src/util.c b/widget_viewer/src/util.c deleted file mode 100644 index eac5a75..0000000 --- a/widget_viewer/src/util.c +++ /dev/null @@ -1,137 +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 -#include -#include -#include - -#include -#include /* For error code */ - -#include "debug.h" -#include "util.h" - -int errno; -#if defined(_USE_ECORE_TIME_GET) -static struct { - clockid_t type; -} s_info = { - .type = CLOCK_MONOTONIC, -}; -#endif - -int util_check_extension(const char *filename, const char *check_ptr) -{ - int name_len; - - name_len = strlen(filename); - while (--name_len >= 0 && *check_ptr) { - if (filename[name_len] != *check_ptr) { - return WIDGET_ERROR_INVALID_PARAMETER; - } - - check_ptr++; - } - - return 0; -} - -double util_timestamp(void) -{ -#if defined(_USE_ECORE_TIME_GET) - struct timespec ts; - - do { - if (clock_gettime(s_info.type, &ts) == 0) { - return ts.tv_sec + ts.tv_nsec / 1000000000.0f; - } - - ErrPrint("%d: %d\n", s_info.type, errno); - if (s_info.type == CLOCK_MONOTONIC) { - s_info.type = CLOCK_REALTIME; - } else if (s_info.type == CLOCK_REALTIME) { - struct timeval tv; - if (gettimeofday(&tv, NULL) < 0) { - ErrPrint("gettimeofday: %d\n", errno); - break; - } - - return tv.tv_sec + tv.tv_usec / 1000000.0f; - } - } while (1); - - return 0.0f; -#else - struct timeval tv; - - if (gettimeofday(&tv, NULL) < 0) { - ErrPrint("gettimeofday: %d\n", errno); - tv.tv_sec = 0; - tv.tv_usec = 0; - } - - return (double)tv.tv_sec + (double)tv.tv_usec / 1000000.0f; -#endif -} - -const char *util_uri_to_path(const char *uri) -{ - int len; - - len = strlen(SCHEMA_FILE); - if (strncasecmp(uri, SCHEMA_FILE, len)) { - return NULL; - } - - return uri + len; -} - -int util_unlink(const char *filename) -{ - char *descfile; - int desclen; - int ret; - - if (!filename) { - return WIDGET_ERROR_INVALID_PARAMETER; - } - - desclen = strlen(filename) + 6; /* .desc */ - descfile = malloc(desclen); - if (!descfile) { - ErrPrint("Heap: %d\n", errno); - return WIDGET_ERROR_OUT_OF_MEMORY; - } - - ret = snprintf(descfile, desclen, "%s.desc", filename); - if (ret < 0) { - ErrPrint("Error: %d\n", errno); - free(descfile); - return WIDGET_ERROR_FAULT; - } - - (void)unlink(descfile); - free(descfile); - (void)unlink(filename); - - return WIDGET_ERROR_NONE; -} - -/* End of a file */ diff --git a/widget_viewer/src/widget.c b/widget_viewer/src/widget.c deleted file mode 100644 index fa5fba2..0000000 --- a/widget_viewer/src/widget.c +++ /dev/null @@ -1,4233 +0,0 @@ -/* - * Copyright 2014 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 -#include -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include "debug.h" -#include "fb.h" -#include "widget_viewer.h" -#include "widget_viewer_internal.h" -#include "dlist.h" -#include "util.h" -#include "master_rpc.h" -#include "client.h" -#include "conf.h" - -#define EAPI __attribute__((visibility("default"))) -#if !defined(WIDGET_COUNT_OF_SIZE_TYPE) - #define WIDGET_COUNT_OF_SIZE_TYPE 13 -#endif - -#if defined(FLOG) -FILE *__file_log_fp; -#endif - -static int default_launch_handler(widget_h handle, const char *appid, void *data); - -static struct info { - int init_count; - int prevent_overwrite; - guint job_timer; - struct dlist *job_list; - - struct launch { - int (*handle)(widget_h handle, const char *appid, void *data); - void *data; - } launch; -} s_info = { - .init_count = 0, - .prevent_overwrite = 0, - .job_timer = 0, - .job_list = NULL, - .launch = { - .handle = default_launch_handler, - .data = NULL, - }, -}; - -static void widget_pixmap_acquired_cb(widget_h handle, const struct packet *result, void *data); -static void gbar_pixmap_acquired_cb(widget_h handle, const struct packet *result, void *data); -static void gbar_xpixmap_acquired_cb(widget_h handle, const struct packet *result, void *data); -static void widget_xpixmap_acquired_cb(widget_h handle, const struct packet *result, void *data); - -static int default_launch_handler(widget_h handle, const char *appid, void *data) -{ - int ret; - - ret = aul_launch_app(appid, NULL); - if (ret <= 0) { - ErrPrint("Failed to launch an app %s (%d)\n", appid, ret); - } - - /* - app_control_h service; - - DbgPrint("AUTO_LAUNCH [%s]\n", handle->common->widget.auto_launch); - - ret = app_control_create(&service); - if (ret == APP_CONTROL_ERROR_NONE) { - app_control_set_package(service, handle->common->widget.auto_launch); - app_control_send_launch_request(service, NULL, NULL); - app_control_destroy(service); - } else { - ErrPrint("Failed to launch an app %s (%d)\n", handle->common->widget.auto_launch, ret); - } - */ - - return ret > 0 ? WIDGET_ERROR_NONE : WIDGET_ERROR_FAULT; -} - -static inline void default_create_cb(widget_h handle, int ret, void *data) -{ - DbgPrint("Default created event handle: %d\n", ret); -} - -static inline void default_pinup_cb(widget_h handle, int ret, void *data) -{ - DbgPrint("Default pinup event handle: %d\n", ret); -} - -static inline void default_group_changed_cb(widget_h handle, int ret, void *data) -{ - DbgPrint("Default group changed event handle: %d\n", ret); -} - -static inline void default_period_changed_cb(widget_h handle, int ret, void *data) -{ - DbgPrint("Default period changed event handle: %d\n", ret); -} - -static inline void default_gbar_created_cb(widget_h handle, int ret, void *data) -{ - DbgPrint("Default GBAR created event handle: %d\n", ret); -} - -static inline void default_gbar_destroyed_cb(widget_h handle, int ret, void *data) -{ - DbgPrint("Default GBAR destroyed event handle: %d\n", ret); -} - -static inline void default_widget_size_changed_cb(widget_h handle, int ret, void *data) -{ - DbgPrint("Default WIDGET size changed event handle: %d\n", ret); -} - -static inline void default_update_mode_cb(widget_h handle, int ret, void *data) -{ - DbgPrint("Default update mode set event handle: %d\n", ret); -} - -static inline void default_access_event_cb(widget_h handle, int ret, void *data) -{ - DbgPrint("Default access event handle: %d\n", ret); -} - -static inline void default_key_event_cb(widget_h handle, int ret, void *data) -{ - DbgPrint("Default key event handle: %d\n", ret); -} - -static void update_mode_cb(widget_h handle, const struct packet *result, void *data) -{ - int ret; - - if (!result) { - ret = WIDGET_ERROR_FAULT; - goto errout; - } else if (packet_get(result, "i", &ret) != 1) { - ErrPrint("Invalid argument\n"); - ret = WIDGET_ERROR_INVALID_PARAMETER; - goto errout; - } - - if (ret < 0) { - ErrPrint("Resize request is failed: %d\n", ret); - goto errout; - } - - return; - -errout: - handle->cbs.update_mode.cb(handle, ret, handle->cbs.update_mode.data); - handle->cbs.update_mode.cb = NULL; - handle->cbs.update_mode.data = NULL; - handle->common->request.update_mode = 0; - - if (handle->common->state != WIDGET_STATE_DELETE) { - if (ret == (int)WIDGET_ERROR_NOT_EXIST && handle->refcnt == 2) { - _widget_invoke_event_handler(handle, WIDGET_EVENT_DELETED); - _widget_unref(handle, 1); - } - } -} - -static void resize_cb(widget_h handle, const struct packet *result, void *data) -{ - int ret; - - if (!result) { - ret = WIDGET_ERROR_FAULT; - goto errout; - } else if (packet_get(result, "i", &ret) != 1) { - ErrPrint("Invalid argument\n"); - ret = WIDGET_ERROR_INVALID_PARAMETER; - goto errout; - } - - /*! - * \note - * In case of resize request, - * The widget handle will not have resized value right after this callback, - * It can only get the new size when it makes updates. - * - * So the user can only get the resized value(result) from the first update event - * after this request. - */ - if (ret < 0) { - ErrPrint("Resize request is failed: %d\n", ret); - goto errout; - } - - return; - -errout: - handle->cbs.size_changed.cb(handle, ret, handle->cbs.size_changed.data); - handle->cbs.size_changed.cb = NULL; - handle->cbs.size_changed.data = NULL; - handle->common->request.size_changed = 0; - - if (handle->common->state != WIDGET_STATE_DELETE) { - if (ret == (int)WIDGET_ERROR_NOT_EXIST && handle->refcnt == 2) { - _widget_invoke_event_handler(handle, WIDGET_EVENT_DELETED); - _widget_unref(handle, 1); - } - } -} - -static void text_signal_cb(widget_h handle, const struct packet *result, void *data) -{ - int ret; - void *cbdata; - struct cb_info *info = data; - widget_ret_cb cb; - - cbdata = info->data; - cb = info->cb; - _widget_destroy_cb_info(info); - - if (!result) { - ret = WIDGET_ERROR_FAULT; - } else if (packet_get(result, "i", &ret) != 1) { - ErrPrint("Invalid argument\n"); - ret = WIDGET_ERROR_INVALID_PARAMETER; - } - - if (cb) { - cb(handle, ret, cbdata); - } - return; -} - -static void set_group_ret_cb(widget_h handle, const struct packet *result, void *data) -{ - int ret; - - if (!result) { - ret = WIDGET_ERROR_FAULT; - goto errout; - } else if (packet_get(result, "i", &ret) != 1) { - ErrPrint("Invalid argument\n"); - ret = WIDGET_ERROR_INVALID_PARAMETER; - goto errout; - } - - if (ret < 0) { - goto errout; - } - - return; - -errout: - handle->cbs.group_changed.cb(handle, ret, handle->cbs.group_changed.data); - handle->cbs.group_changed.cb = NULL; - handle->cbs.group_changed.data = NULL; - handle->common->request.group_changed = 0; - - if (handle->common->state != WIDGET_STATE_DELETE) { - if (ret == (int)WIDGET_ERROR_NOT_EXIST && handle->refcnt == 2) { - _widget_invoke_event_handler(handle, WIDGET_EVENT_DELETED); - _widget_unref(handle, 1); - } - } -} - -static void period_ret_cb(widget_h handle, const struct packet *result, void *data) -{ - int ret; - - if (!result) { - ret = WIDGET_ERROR_FAULT; - goto errout; - } else if (packet_get(result, "i", &ret) != 1) { - ErrPrint("Invalid argument\n"); - ret = WIDGET_ERROR_INVALID_PARAMETER; - goto errout; - } - - if (ret < 0) { - goto errout; - } - - return; - -errout: - handle->cbs.period_changed.cb(handle, ret, handle->cbs.period_changed.data); - handle->cbs.period_changed.cb = NULL; - handle->cbs.period_changed.data = NULL; - handle->common->request.period_changed = 0; - - if (handle->common->state != WIDGET_STATE_DELETE) { - if (ret == (int)WIDGET_ERROR_NOT_EXIST && handle->refcnt == 2) { - _widget_invoke_event_handler(handle, WIDGET_EVENT_DELETED); - _widget_unref(handle, 1); - } - } -} - -static void gbar_create_cb(widget_h handle, const struct packet *result, void *data) -{ - int ret; - - if (!result) { - ret = WIDGET_ERROR_FAULT; - goto errout; - } else if (packet_get(result, "i", &ret) != 1) { - ret = WIDGET_ERROR_INVALID_PARAMETER; - goto errout; - } - - if (ret < 0) { - ErrPrint("Failed to create a GBAR[%d]\n", ret); - goto errout; - } - - return; - -errout: - handle->cbs.gbar_created.cb(handle, ret, handle->cbs.gbar_created.data); - handle->cbs.gbar_created.cb = NULL; - handle->cbs.gbar_created.data = NULL; - handle->common->request.gbar_created = 0; - - if (handle->common->state != WIDGET_STATE_DELETE) { - if (ret == (int)WIDGET_ERROR_NOT_EXIST && handle->refcnt == 2) { - _widget_invoke_event_handler(handle, WIDGET_EVENT_DELETED); - _widget_unref(handle, 1); - } - } -} - -static void activated_cb(widget_h handle, const struct packet *result, void *data) -{ - int ret; - struct cb_info *info = data; - void *cbdata; - widget_ret_cb cb; - const char *pkgname = ""; - - cbdata = info->data; - cb = info->cb; - _widget_destroy_cb_info(info); - - if (!result) { - ret = WIDGET_ERROR_FAULT; - } else if (packet_get(result, "is", &ret, &pkgname) != 2) { - ret = WIDGET_ERROR_INVALID_PARAMETER; - } - - if (cb) { - cb(handle, ret, cbdata); - } -} - -static void gbar_destroy_cb(widget_h handle, const struct packet *result, void *data) -{ - int ret; - widget_ret_cb cb; - void *cbdata; - struct cb_info *info = data; - - cbdata = info->data; - cb = info->cb; - _widget_destroy_cb_info(info); - - if (!result) { - ErrPrint("Result is NIL (may connection lost)\n"); - ret = WIDGET_ERROR_FAULT; - } else if (packet_get(result, "i", &ret) != 1) { - ErrPrint("Invalid parameter\n"); - ret = WIDGET_ERROR_INVALID_PARAMETER; - } - - if (ret == (int)WIDGET_ERROR_NONE) { - handle->cbs.gbar_destroyed.cb = cb; - handle->cbs.gbar_destroyed.data = cbdata; - } else { - handle->common->is_gbar_created = 0; - handle->common->request.gbar_destroyed = 0; - - if (cb) { - cb(handle, ret, cbdata); - } - } -} - -static void _delete_cluster_cb(widget_h handle, const struct packet *result, void *data) -{ - struct cb_info *info = data; - int ret; - widget_ret_cb cb; - void *cbdata; - - cb = info->cb; - cbdata = info->data; - _widget_destroy_cb_info(info); - - if (!result) { - ret = WIDGET_ERROR_FAULT; - } else if (packet_get(result, "i", &ret) != 1) { - ret = WIDGET_ERROR_INVALID_PARAMETER; - } - - if (cb) { - cb(handle, ret, cbdata); - } -} - -static void _delete_category_cb(widget_h handle, const struct packet *result, void *data) -{ - struct cb_info *info = data; - int ret; - widget_ret_cb cb; - void *cbdata; - - cb = info->cb; - cbdata = info->data; - _widget_destroy_cb_info(info); - - if (!result) { - ret = WIDGET_ERROR_FAULT; - } else if (packet_get(result, "i", &ret) != 1) { - ret = WIDGET_ERROR_INVALID_PARAMETER; - } - - if (cb) { - cb(handle, ret, cbdata); - } -} - -static int _widget_acquire_widget_pixmap(widget_h handle, widget_ret_cb cb, void *data) -{ - struct packet *packet; - struct cb_info *cbinfo; - const char *id; - unsigned int cmd = CMD_WIDGET_ACQUIRE_PIXMAP; - int ret; - - id = fb_id(handle->common->widget.fb); - if (!id || strncasecmp(id, SCHEMA_PIXMAP, strlen(SCHEMA_PIXMAP))) { - return WIDGET_ERROR_INVALID_PARAMETER; - } - - packet = packet_create((const char *)&cmd, "ss", handle->common->pkgname, handle->common->id); - if (!packet) { - ErrPrint("Failed to build a param\n"); - return WIDGET_ERROR_FAULT; - } - - cbinfo = _widget_create_cb_info(cb, data); - if (!cbinfo) { - packet_destroy(packet); - return WIDGET_ERROR_FAULT; - } - - ret = master_rpc_async_request(handle, packet, 0, widget_pixmap_acquired_cb, cbinfo); - if (ret < 0) { - _widget_destroy_cb_info(cbinfo); - } - - return ret; -} - -static void widget_pixmap_acquired_cb(widget_h handle, const struct packet *result, void *data) -{ - int pixmap; - int ret = WIDGET_ERROR_INVALID_PARAMETER; - widget_ret_cb cb; - void *cbdata; - struct cb_info *info = data; - - cb = info->cb; - cbdata = info->data; - _widget_destroy_cb_info(info); - - if (!result) { - pixmap = 0; /* PIXMAP 0 means error */ - } else if (packet_get(result, "ii", &pixmap, &ret) != 2) { - pixmap = 0; - } - - if (ret == (int)WIDGET_ERROR_RESOURCE_BUSY) { - ret = _widget_acquire_widget_pixmap(handle, cb, cbdata); - DbgPrint("Busy, Try again: %d\n", ret); - /* Try again */ - } else if (ret == (int)WIDGET_ERROR_NOT_EXIST && handle->refcnt == 2) { - if (cb) { - cb(handle, pixmap, cbdata); - } - - if (handle->common->state != WIDGET_STATE_DELETE) { - _widget_invoke_event_handler(handle, WIDGET_EVENT_DELETED); - _widget_unref(handle, 1); - } - } else { - if (cb) { - cb(handle, pixmap, cbdata); - } - } -} - -static void widget_xpixmap_acquired_cb(widget_h handle, const struct packet *result, void *data) -{ - int pixmap; - int ret = WIDGET_ERROR_INVALID_PARAMETER; - widget_ret_cb cb; - void *cbdata; - struct cb_info *info = data; - - cb = info->cb; - cbdata = info->data; - _widget_destroy_cb_info(info); - - if (!result) { - pixmap = 0; - } else if (packet_get(result, "ii", &pixmap, &ret) != 2) { - pixmap = 0; - } - - if (cb) { - cb(handle, pixmap, cbdata); - } - - if (handle->common->state != WIDGET_STATE_DELETE) { - if (ret == (int)WIDGET_ERROR_NOT_EXIST && handle->refcnt == 2) { - _widget_invoke_event_handler(handle, WIDGET_EVENT_DELETED); - _widget_unref(handle, 1); - } - } -} - -static int widget_acquire_gbar_extra_pixmap(widget_h handle, int idx, widget_ret_cb cb, void *data) -{ - struct packet *packet; - struct cb_info *cbinfo; - unsigned int cmd = CMD_GBAR_ACQUIRE_XPIXMAP; - int ret; - - packet = packet_create((const char *)&cmd, "ssi", handle->common->pkgname, handle->common->id, idx); - if (!packet) { - ErrPrint("Failed to build a param\n"); - return WIDGET_ERROR_FAULT; - } - - cbinfo = _widget_create_cb_info(cb, data); - if (!cbinfo) { - packet_destroy(packet); - return WIDGET_ERROR_FAULT; - } - - ret = master_rpc_async_request(handle, packet, 0, gbar_xpixmap_acquired_cb, cbinfo); - if (ret < 0) { - /*! - * \note - * Packet will be destroyed by master_rpc_async_request - */ - _widget_destroy_cb_info(cbinfo); - } - - return ret; -} - -static int widget_acquire_widget_extra_pixmap(widget_h handle, int idx, widget_ret_cb cb, void *data) -{ - struct packet *packet; - struct cb_info *cbinfo; - unsigned int cmd = CMD_WIDGET_ACQUIRE_XPIXMAP; - int ret; - - packet = packet_create((const char *)&cmd, "ssi", handle->common->pkgname, handle->common->id, idx); - if (!packet) { - ErrPrint("Failed to build a param\n"); - return WIDGET_ERROR_FAULT; - } - - cbinfo = _widget_create_cb_info(cb, data); - if (!cbinfo) { - packet_destroy(packet); - return WIDGET_ERROR_FAULT; - } - - ret = master_rpc_async_request(handle, packet, 0, widget_xpixmap_acquired_cb, cbinfo); - if (ret < 0) { - /*! - * \note - * Packet will be destroyed by master_rpc_async_request - */ - _widget_destroy_cb_info(cbinfo); - } - - return ret; -} - -static int widget_acquire_gbar_pixmap(widget_h handle, widget_ret_cb cb, void *data) -{ - struct packet *packet; - struct cb_info *cbinfo; - unsigned int cmd = CMD_GBAR_ACQUIRE_PIXMAP; - const char *id; - int ret; - - id = fb_id(handle->common->gbar.fb); - if (!id || strncasecmp(id, SCHEMA_PIXMAP, strlen(SCHEMA_PIXMAP))) { - return WIDGET_ERROR_INVALID_PARAMETER; - } - - packet = packet_create((const char *)&cmd, "ss", handle->common->pkgname, handle->common->id); - if (!packet) { - ErrPrint("Failed to build a param\n"); - return WIDGET_ERROR_FAULT; - } - - cbinfo = _widget_create_cb_info(cb, data); - if (!cbinfo) { - packet_destroy(packet); - return WIDGET_ERROR_FAULT; - } - - ret = master_rpc_async_request(handle, packet, 0, gbar_pixmap_acquired_cb, cbinfo); - if (ret < 0) { - /*! - * \note - * Packet will be destroyed by master_rpc_async_request - */ - _widget_destroy_cb_info(cbinfo); - } - - return ret; -} - -static void gbar_xpixmap_acquired_cb(widget_h handle, const struct packet *result, void *data) -{ - int pixmap; - int ret; - widget_ret_cb cb; - void *cbdata; - struct cb_info *info = data; - - cb = info->cb; - cbdata = info->data; - _widget_destroy_cb_info(info); - - if (!result) { - pixmap = 0; /* PIXMAP 0 means error */ - ret = WIDGET_ERROR_FAULT; - } else if (packet_get(result, "ii", &pixmap, &ret) != 2) { - pixmap = 0; - ret = WIDGET_ERROR_INVALID_PARAMETER; - } - - if (cb) { - DbgPrint("ret: %x, pixmap: %d\n", ret, pixmap); - cb(handle, pixmap, cbdata); - } - - if (handle->common->state != WIDGET_STATE_DELETE) { - if (ret == (int)WIDGET_ERROR_NOT_EXIST && handle->refcnt == 2) { - _widget_invoke_event_handler(handle, WIDGET_EVENT_DELETED); - _widget_unref(handle, 1); - } - } -} - -static void gbar_pixmap_acquired_cb(widget_h handle, const struct packet *result, void *data) -{ - int pixmap; - int ret; - widget_ret_cb cb; - void *cbdata; - struct cb_info *info = data; - - cb = info->cb; - cbdata = info->data; - _widget_destroy_cb_info(info); - - if (!result) { - pixmap = 0; /* PIXMAP 0 means error */ - ret = WIDGET_ERROR_FAULT; - } else if (packet_get(result, "ii", &pixmap, &ret) != 2) { - pixmap = 0; - ret = WIDGET_ERROR_INVALID_PARAMETER; - } - - if (ret == (int)WIDGET_ERROR_RESOURCE_BUSY) { - ret = widget_acquire_gbar_pixmap(handle, cb, cbdata); - DbgPrint("Busy, Try again: %d\n", ret); - /* Try again */ - } else if (ret == (int)WIDGET_ERROR_NOT_EXIST && handle->refcnt == 2) { - if (cb) { - cb(handle, pixmap, cbdata); - } - - if (handle->common->state != WIDGET_STATE_DELETE) { - _widget_invoke_event_handler(handle, WIDGET_EVENT_DELETED); - _widget_unref(handle, 1); - } - } else { - if (cb) { - DbgPrint("ret: %d, pixmap: %d\n", ret, pixmap); - cb(handle, pixmap, cbdata); - } - } -} - -static void pinup_done_cb(widget_h handle, const struct packet *result, void *data) -{ - int ret; - - if (!result) { - ret = WIDGET_ERROR_FAULT; - goto errout; - } else if (packet_get(result, "i", &ret) != 1) { - goto errout; - } - - if (ret < 0) { - goto errout; - } - - return; - -errout: - handle->cbs.pinup.cb(handle, ret, handle->cbs.pinup.data); - handle->cbs.pinup.cb = NULL; - handle->cbs.pinup.data = NULL; - handle->common->request.pinup = 0; - - if (handle->common->state != WIDGET_STATE_DELETE) { - if (ret == (int)WIDGET_ERROR_NOT_EXIST && handle->refcnt == 2) { - _widget_invoke_event_handler(handle, WIDGET_EVENT_DELETED); - _widget_unref(handle, 1); - } - } -} - -static void key_ret_cb(widget_h handle, const struct packet *result, void *data) -{ - int ret; - - if (!result) { - ret = WIDGET_ERROR_FAULT; - return; - } - - if (packet_get(result, "i", &ret) != 1) { - ret = WIDGET_ERROR_INVALID_PARAMETER; - return; - } - - if (ret != WIDGET_ERROR_NONE) { - goto errout; - } - - return; -errout: - handle->cbs.key_event.cb(handle, ret, handle->cbs.key_event.data); - handle->cbs.key_event.cb = NULL; - handle->cbs.key_event.data = NULL; - handle->common->request.key_event = 0; - - if (handle->common->state != WIDGET_STATE_DELETE) { - if (ret == (int)WIDGET_ERROR_NOT_EXIST && handle->refcnt == 2) { - _widget_invoke_event_handler(handle, WIDGET_EVENT_DELETED); - _widget_unref(handle, 1); - } - } -} - -static void access_ret_cb(widget_h handle, const struct packet *result, void *data) -{ - int ret; - - if (!result) { - ret = WIDGET_ERROR_FAULT; - return; - } - - if (packet_get(result, "i", &ret) != 1) { - ret = WIDGET_ERROR_INVALID_PARAMETER; - return; - } - - if (ret != WIDGET_ERROR_NONE) { - goto errout; - } - - return; - -errout: - handle->cbs.access_event.cb(handle, ret, handle->cbs.access_event.data); - handle->cbs.access_event.cb = NULL; - handle->cbs.access_event.data = NULL; - handle->common->request.access_event = 0; - - if (handle->common->state != WIDGET_STATE_DELETE) { - if (ret == (int)WIDGET_ERROR_NOT_EXIST && handle->refcnt == 2) { - _widget_invoke_event_handler(handle, WIDGET_EVENT_DELETED); - _widget_unref(handle, 1); - } - } -} - -static int send_access_event(widget_h handle, const char *event, int x, int y, int type) -{ - struct packet *packet; - double timestamp; - - timestamp = util_timestamp(); - - packet = packet_create(event, "ssdiii", handle->common->pkgname, handle->common->id, timestamp, x, y, type); - if (!packet) { - ErrPrint("Failed to build packet\n"); - return WIDGET_ERROR_FAULT; - } - - return master_rpc_async_request(handle, packet, 0, access_ret_cb, NULL); -} - -static int send_key_event(widget_h handle, const char *event, unsigned int keycode, int device) -{ - struct packet *packet; - double timestamp; - - timestamp = util_timestamp(); - packet = packet_create(event, "ssdii", handle->common->pkgname, handle->common->id, timestamp, keycode, device); - if (!packet) { - ErrPrint("Failed to build packet\n"); - return WIDGET_ERROR_FAULT; - } - - return master_rpc_async_request(handle, packet, 0, key_ret_cb, NULL); -} - -static int send_mouse_event(widget_h handle, const char *event, int x, int y, double ratio_w, double ratio_h, int device) -{ - struct packet *packet; - double timestamp; - - timestamp = util_timestamp(); - packet = packet_create_noack(event, "ssdiiiddi", handle->common->pkgname, handle->common->id, timestamp, x, y, INPUT_EVENT_SOURCE_VIEWER, ratio_w, ratio_h, device); - if (!packet) { - ErrPrint("Failed to build param\n"); - return WIDGET_ERROR_FAULT; - } - - return master_rpc_request_only(handle, packet); -} - -static int initialize_widget(void *disp, int use_thread) -{ - int ret; -#if defined(FLOG) - char filename[BUFSIZ]; - snprintf(filename, sizeof(filename), "/tmp/%d.box.log", getpid()); - __file_log_fp = fopen(filename, "w+t"); - if (!__file_log_fp) { - __file_log_fp = fdopen(1, "w+t"); - } -#endif - ret = widget_service_init(); - if (ret != WIDGET_ERROR_NONE) { - return ret; - } - - ret = fb_init(disp); - if (ret != WIDGET_ERROR_NONE) { - widget_service_fini(); - return ret; - } - - ret = client_init(use_thread); - if (ret != WIDGET_ERROR_NONE) { - fb_fini(); - widget_service_fini(); - return ret; - } - - s_info.init_count++; - return ret; -} - -static inline char *_widget_pkgname(const char *pkgname) -{ - char *widget; - - widget = widget_service_get_widget_id(pkgname); - if (!widget) { - widget = strdup(pkgname); - } - - return widget; -} - -static gboolean job_execute_cb(void *data) -{ - struct job_item *item; - struct dlist *l; - - l = dlist_nth(s_info.job_list, 0); - if (!l) { - s_info.job_timer = 0; - return FALSE; - } - - item = dlist_data(l); - s_info.job_list = dlist_remove(s_info.job_list, l); - - if (item) { - item->cb(item->handle, item->ret, item->data); - _widget_unref(item->handle, 1); - free(item); - } - - return TRUE; -} - -static int job_add(widget_h handle, widget_ret_cb job_cb, int ret, void *data) -{ - struct job_item *item; - - if (!job_cb) { - ErrPrint("Invalid argument\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - item = malloc(sizeof(*item)); - if (!item) { - ErrPrint("Heap: %d\n", errno); - return WIDGET_ERROR_OUT_OF_MEMORY; - } - - item->handle = _widget_ref(handle); - item->cb = job_cb; - item->data = data; - item->ret = ret; - - s_info.job_list = dlist_append(s_info.job_list, item); - - if (!s_info.job_timer) { - s_info.job_timer = g_timeout_add(1, job_execute_cb, NULL); - if (!s_info.job_timer) { - ErrPrint("Failed to create a job timer\n"); - } - } - - return WIDGET_ERROR_NONE; -} - -static void new_ret_cb(widget_h handle, const struct packet *result, void *data) -{ - int ret; - struct cb_info *info = data; - widget_ret_cb cb; - void *cbdata; - - cb = info->cb; - cbdata = info->data; - _widget_destroy_cb_info(info); - - if (!result) { - ret = WIDGET_ERROR_FAULT; - } else if (packet_get(result, "i", &ret) != 1) { - ret = WIDGET_ERROR_INVALID_PARAMETER; - } - - if (ret >= 0) { - handle->cbs.created.cb = cb; - handle->cbs.created.data = cbdata; - - /*! - * \note - * Don't go anymore ;) - */ - return; - } else if (cb) { - /*! - * \note - * It means the current instance is not created, - * so user has to know about this. - * notice it to user using "deleted" event. - */ - cb(handle, ret, cbdata); - } - - _widget_unref(handle, 1); -} - -static int create_real_instance(widget_h handle, widget_ret_cb cb, void *data) -{ - struct cb_info *cbinfo; - struct packet *packet; - struct widget_common *common; - unsigned int cmd = CMD_NEW; - int ret; - - common = handle->common; - - packet = packet_create((const char *)&cmd, "dssssdii", - common->timestamp, common->pkgname, common->content, - common->cluster, common->category, - common->widget.period, common->widget.width, common->widget.height); - if (!packet) { - ErrPrint("Failed to create a new packet\n"); - set_last_result(WIDGET_ERROR_FAULT); - return WIDGET_ERROR_FAULT; - } - - cbinfo = _widget_create_cb_info(cb, data); - if (!cbinfo) { - ErrPrint("Failed to create a cbinfo\n"); - packet_destroy(packet); - set_last_result(WIDGET_ERROR_OUT_OF_MEMORY); - return WIDGET_ERROR_OUT_OF_MEMORY; - } - - /*! - * \note - * master_rpc_async_request will destroy the packet (decrease the refcnt) - * So be aware the packet object after return from master_rpc_async_request. - */ - ret = master_rpc_async_request(handle, packet, 0, new_ret_cb, cbinfo); - if (ret < 0) { - ErrPrint("Failed to send a new packet\n"); - _widget_destroy_cb_info(cbinfo); - set_last_result(WIDGET_ERROR_FAULT); - return WIDGET_ERROR_FAULT; - } - handle->common->request.created = 1; - return WIDGET_ERROR_NONE; -} - -static void create_cb(widget_h handle, int ret, void *data) -{ - struct cb_info *cbinfo = data; - - if (cbinfo->cb) { - cbinfo->cb(handle, ret, cbinfo->data); - } - - _widget_destroy_cb_info(cbinfo); - - /*! - * \note - * Forcely generate "updated" event - */ - _widget_invoke_event_handler(handle, WIDGET_EVENT_WIDGET_UPDATED); -} - -static int create_fake_instance(widget_h handle, widget_ret_cb cb, void *data) -{ - struct cb_info *cbinfo; - - cbinfo = _widget_create_cb_info(cb, data); - if (!cbinfo) { - ErrPrint("Failed to create a cbinfo\n"); - return WIDGET_ERROR_OUT_OF_MEMORY; - } - - if (job_add(handle, create_cb, WIDGET_ERROR_NONE, cbinfo) != WIDGET_ERROR_NONE) { - _widget_destroy_cb_info(cbinfo); - } - - return WIDGET_ERROR_NONE; -} - -static void refresh_for_paused_updating_cb(widget_h handle, int ret, void *data) -{ - if (handle->paused_updating == 0) { - DbgPrint("Paused updates are cleared\n"); - return; - } - - DbgPrint("Pending updates are found\n"); - _widget_invoke_event_handler(handle, WIDGET_EVENT_WIDGET_UPDATED); -} - -static int _widget_set_visibility(widget_h handle, widget_visible_state_e state) -{ - struct packet *packet; - int need_to_add_job = 0; - unsigned int cmd = CMD_CHANGE_VISIBILITY; - int ret; - - if (handle->common->visible != WIDGET_SHOW && state == WIDGET_SHOW) { - need_to_add_job = !!handle->paused_updating; - } else if (handle->common->visible == WIDGET_SHOW && state != WIDGET_SHOW) { - if (!!_widget_find_widget_in_show(handle->common)) { - return WIDGET_ERROR_NONE; - } - } else if (handle->common->visible == WIDGET_SHOW && state == WIDGET_SHOW && handle->paused_updating) { - if (job_add(handle, refresh_for_paused_updating_cb, WIDGET_ERROR_NONE, NULL) < 0) { - ErrPrint("Unable to add a new job for refreshing box\n"); - } - - return WIDGET_ERROR_NONE; - } else { - /*! - * \brief - * No need to send this to the master - */ - return WIDGET_ERROR_NONE; - } - - packet = packet_create_noack((const char *)&cmd, "ssi", handle->common->pkgname, handle->common->id, (int)state); - if (!packet) { - ErrPrint("Failed to create a packet\n"); - return WIDGET_ERROR_FAULT; - } - - ret = master_rpc_request_only(handle, packet); - if (ret == (int)WIDGET_ERROR_NONE) { - DbgPrint("[%s] visibility is changed 0x[%x]\n", handle->common->pkgname, state); - handle->common->visible = state; - - if (need_to_add_job) { - if (job_add(handle, refresh_for_paused_updating_cb, WIDGET_ERROR_NONE, NULL) < 0) { - ErrPrint("Unable to add a new job for refreshing box\n"); - } - } - } - - return ret; -} - -static void _widget_update_visibility(struct widget_common *old_common) -{ - widget_h item; - - item = _widget_find_widget_in_show(old_common); - if (!item) { - item = _widget_get_widget_nth(old_common, 0); - if (item) { - _widget_set_visibility(item, WIDGET_HIDE_WITH_PAUSE); - } else { - ErrPrint("Unable to get the valid handle from common handle\n"); - } - } else { - _widget_set_visibility(item, WIDGET_SHOW); - } -} - -/*! - * \note - * The second parameter should be the "return value", - * But in this case, we will use it for "type of deleting instance". - */ -static void _job_del_cb(widget_h handle, int type, void *data) -{ - struct cb_info *cbinfo = data; - widget_ret_cb cb; - - if (handle->visible == WIDGET_SHOW) { - _widget_update_visibility(handle->common); - } - - cb = cbinfo->cb; - data = cbinfo->data; - _widget_destroy_cb_info(cbinfo); - - if (handle->common->state != WIDGET_STATE_CREATE) { - DbgPrint("[%s] %d\n", handle->common->pkgname, handle->refcnt); - if (cb) { - cb(handle, WIDGET_ERROR_NONE, data); - } - - return; - } - - if (handle->common->refcnt == 1) { - handle->common->delete_type = type; - handle->common->state = WIDGET_STATE_DELETE; - - if (!handle->common->id) { - /*! - * \note - * The id is not determined yet. - * It means a user didn't receive created event yet. - * Then just stop to delete procedure from here. - * Because the "created" event handle will release this. - * By the way, if the user adds any callback for getting return status of this, - * call it at here. - */ - if (cb) { - cb(handle, WIDGET_ERROR_NONE, data); - } - } - - DbgPrint("Send delete request [%s]\n", handle->common->id); - _widget_send_delete(handle, type, cb, data); - } else { - if (cb) { - cb(handle, WIDGET_ERROR_NONE, data); - } - - DbgPrint("Before unref: %d\n", handle->common->refcnt); - _widget_unref(handle, 1); - } -} - -static void _resize_job_cb(widget_h handle, int ret, void *data) -{ - struct cb_info *info = data; - - if (info->cb) { - info->cb(handle, ret, info->data); - } - - free(info); - - /*! - * \note - * Forcely update the box - */ - _widget_invoke_event_handler(handle, WIDGET_EVENT_WIDGET_UPDATED); -} - -static void _turn_off_gbar_destroyed_flag_cb(widget_h handle, int ret, void *data) -{ - if (handle->common->request.gbar_destroyed) { - widget_ret_cb cb; - void *data; - - DbgPrint("gbar_destroyed request is canceled\n"); - handle->common->request.gbar_destroyed = 0; - cb = handle->cbs.gbar_destroyed.cb; - data = handle->cbs.gbar_destroyed.data; - handle->cbs.gbar_destroyed.cb = NULL; - handle->cbs.gbar_destroyed.data = NULL; - - if (cb) { - cb(handle, ret, data); - } - } -} - -static void _turn_off_gbar_created_flag_cb(widget_h handle, int ret, void *data) -{ - if (handle->common->request.gbar_created) { - widget_ret_cb cb; - void *data; - - DbgPrint("gbar_created request is canceled\n"); - handle->common->request.gbar_created = 0; - cb = handle->cbs.gbar_created.cb; - data = handle->cbs.gbar_created.data; - handle->cbs.gbar_created.cb = NULL; - handle->cbs.gbar_created.data = NULL; - - if (cb) { - cb(handle, ret, data); - } - } -} - -EAPI int widget_viewer_init(void *disp, int prevent_overwrite, double event_filter, int use_thread) -{ - if (s_info.init_count > 0) { - s_info.init_count++; - return WIDGET_ERROR_NONE; - } - - /*! - * \note - * Some application doesn't want to use the environment value. - * So set them using arguments. - */ - s_info.prevent_overwrite = prevent_overwrite; - conf_set_event_filter(event_filter); - - return initialize_widget(disp, use_thread); -} - -EAPI int widget_viewer_fini(void) -{ - if (s_info.init_count <= 0) { - ErrPrint("Doesn't initialized\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - s_info.init_count--; - if (s_info.init_count > 0) { - ErrPrint("init count : %d\n", s_info.init_count); - return WIDGET_ERROR_NONE; - } - - client_fini(); - fb_fini(); - widget_service_fini(); - return WIDGET_ERROR_NONE; -} - -EAPI widget_h widget_viewer_add_widget(const char *pkgname, const char *content, const char *cluster, const char *category, double period, widget_size_type_e type, widget_ret_cb cb, void *data) -{ - char *widgetid; - widget_h handle; - int w = 0; - int h = 0; - - if (!pkgname || !cluster || !category) { - ErrPrint("Invalid arguments: pkgname[%p], cluster[%p], category[%p]\n", - pkgname, cluster, category); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return NULL; - } - - widgetid = _widget_pkgname(pkgname); - if (!widgetid) { - ErrPrint("Invalid package: %s\n", pkgname); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return NULL; - } - - if (widget_service_is_enabled(widgetid) == 0) { - DbgPrint("Livebox [%s](%s) is disabled package\n", widgetid, pkgname); - free(widgetid); - set_last_result(WIDGET_ERROR_DISABLED); - return NULL; - } - - if (type != WIDGET_SIZE_TYPE_UNKNOWN) { - (void)widget_service_get_size(type, &w, &h); - } - - handle = calloc(1, sizeof(*handle)); - if (!handle) { - ErrPrint("Error: %d\n", errno); - free(widgetid); - set_last_result(WIDGET_ERROR_OUT_OF_MEMORY); - return NULL; - } - - if (!cb) { - cb = default_create_cb; - } - - handle->common = _widget_find_sharable_common_handle(widgetid, content, w, h, cluster, category); - if (!handle->common) { - handle->common = _widget_create_common_handle(handle, widgetid, cluster, category); - free(widgetid); - if (!handle->common) { - ErrPrint("Failed to find common handle\n"); - free(handle); - return NULL; - } - - if (!content || !strlen(content)) { - char *pc; - /** - * @note - * I know the content should not be modified. use it temporarly without "const" - */ - pc = widget_service_get_content_string(handle->common->pkgname); - _widget_set_content(handle->common, pc); - free(pc); - } else { - _widget_set_content(handle->common, content); - } - - _widget_set_period(handle->common, period); - _widget_set_size(handle->common, w, h); - _widget_common_ref(handle->common, handle); - - if (create_real_instance(handle, cb, data) < 0) { - if (_widget_common_unref(handle->common, handle) == 0) { - /*! - * Delete common - */ - _widget_destroy_common_handle(handle->common); - handle->common = NULL; - } - free(handle); - return NULL; - } - } else { - free(widgetid); - - _widget_common_ref(handle->common, handle); - - if (handle->common->request.created) { - /*! - * If a box is in creating, wait its result too - */ - handle->cbs.created.cb = cb; - handle->cbs.created.data = data; - } else { - /*! - * or fire the fake created_event - */ - if (create_fake_instance(handle, cb, data) < 0) { - if (_widget_common_unref(handle->common, handle) == 0) { - /*! - * Delete common - */ - _widget_destroy_common_handle(handle->common); - } - free(handle); - return NULL; - } - } - } - - handle->visible = WIDGET_HIDE_WITH_PAUSE; - handle->state = WIDGET_STATE_CREATE; - handle = _widget_ref(handle); - - return handle; -} - -EAPI int widget_viewer_get_period(widget_h handle, double *period) -{ - int ret = WIDGET_ERROR_NONE; - double result_period = -1.0f; - - if (!handle || handle->state != WIDGET_STATE_CREATE || period == NULL) { - ErrPrint("Handler is not valid\n"); - ret = WIDGET_ERROR_INVALID_PARAMETER; - goto out; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Invalid handle\n"); - ret = WIDGET_ERROR_INVALID_PARAMETER; - goto out; - } - - if (!handle->common->id) { - ErrPrint("Hnalder is not valid\n"); - ret = WIDGET_ERROR_INVALID_PARAMETER; - goto out; - } - - result_period = handle->common->widget.period; - -out: - if (period) - *period = result_period; - - return ret; -} - -EAPI int widget_viewer_set_period(widget_h handle, double period, widget_ret_cb cb, void *data) -{ - struct packet *packet; - unsigned int cmd = CMD_SET_PERIOD; - int ret; - - if (!handle || handle->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is not valid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Invalid handle\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common->id) { - ErrPrint("Handler is not valid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (handle->common->request.period_changed) { - ErrPrint("Previous request for changing period is not finished\n"); - return WIDGET_ERROR_RESOURCE_BUSY; - } - - if (!handle->common->is_user) { - ErrPrint("CA Livebox is not able to change the period\n"); - return WIDGET_ERROR_PERMISSION_DENIED; - } - - if (handle->common->widget.period == period) { - DbgPrint("No changes\n"); - return WIDGET_ERROR_ALREADY_EXIST; - } - - packet = packet_create((const char *)&cmd, "ssd", handle->common->pkgname, handle->common->id, period); - if (!packet) { - ErrPrint("Failed to build a packet %s\n", handle->common->pkgname); - return WIDGET_ERROR_FAULT; - } - - if (!cb) { - cb = default_period_changed_cb; - } - - ret = master_rpc_async_request(handle, packet, 0, period_ret_cb, NULL); - if (ret == (int)WIDGET_ERROR_NONE) { - handle->cbs.period_changed.cb = cb; - handle->cbs.period_changed.data = data; - handle->common->request.period_changed = 1; - } - - return ret; -} - -EAPI int widget_viewer_delete_widget(widget_h handle, widget_delete_type_e type, widget_ret_cb cb, void *data) -{ - struct cb_info *cbinfo; - - if (!handle) { - ErrPrint("Handler is NIL\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (handle->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is already deleted\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - handle->state = WIDGET_STATE_DELETE; - - cbinfo = _widget_create_cb_info(cb, data); - if (!cbinfo) { - ErrPrint("Failed to create a cbinfo\n"); - return WIDGET_ERROR_OUT_OF_MEMORY; - } - - if (job_add(handle, _job_del_cb, type, cbinfo) != WIDGET_ERROR_NONE) { - ErrPrint("Failed to add a new job\n"); - _widget_destroy_cb_info(cbinfo); - return WIDGET_ERROR_FAULT; - } - - return WIDGET_ERROR_NONE; -} - -EAPI int widget_viewer_add_fault_handler(widget_fault_handler_cb widget_cb, void *data) -{ - if (!widget_cb) { - return WIDGET_ERROR_INVALID_PARAMETER; - } - - return _widget_add_fault_handler(widget_cb, data); -} - -EAPI void *widget_viewer_remove_fault_handler(widget_fault_handler_cb widget_cb) -{ - if (!widget_cb) { - return NULL; - } - - return _widget_remove_fault_handler(widget_cb); -} - -EAPI int widget_viewer_add_event_handler(widget_event_handler_cb widget_cb, void *data) -{ - if (!widget_cb) { - ErrPrint("Invalid argument widget_cb is nil\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - return _widget_add_event_handler(widget_cb, data); -} - -EAPI void *widget_viewer_remove_event_handler(widget_event_handler_cb widget_cb) -{ - if (!widget_cb) { - return NULL; - } - - return _widget_remove_event_handler(widget_cb); -} - -EAPI int widget_viewer_set_update_mode(widget_h handle, int active_update, widget_ret_cb cb, void *data) -{ - struct packet *packet; - unsigned int cmd = CMD_UPDATE_MODE; - int ret; - - if (!handle || handle->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is Invalid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is Invalid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common->id) { - ErrPrint("Handler is Invalid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (handle->common->request.update_mode) { - ErrPrint("Previous update_mode cb is not finished yet\n"); - return WIDGET_ERROR_RESOURCE_BUSY; - } - - if (handle->common->is_active_update == active_update) { - return WIDGET_ERROR_ALREADY_EXIST; - } - - if (!handle->common->is_user) { - return WIDGET_ERROR_PERMISSION_DENIED; - } - - packet = packet_create((const char *)&cmd, "ssi", handle->common->pkgname, handle->common->id, active_update); - if (!packet) { - return WIDGET_ERROR_FAULT; - } - - if (!cb) { - cb = default_update_mode_cb; - } - - ret = master_rpc_async_request(handle, packet, 0, update_mode_cb, NULL); - if (ret == (int)WIDGET_ERROR_NONE) { - handle->cbs.update_mode.cb = cb; - handle->cbs.update_mode.data = data; - handle->common->request.update_mode = 1; - } - - return ret; -} - -EAPI int widget_viewer_is_active_update(widget_h handle) -{ - if (!handle || handle->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is Invalid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is Invalid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common->id) { - return WIDGET_ERROR_INVALID_PARAMETER; - } - - return handle->common->is_active_update; -} - -EAPI int widget_viewer_resize_widget(widget_h handle, widget_size_type_e type, widget_ret_cb cb, void *data) -{ - struct widget_common *common; - int w; - int h; - int ret; - - /*! - * \TODO - * If this handle is host instance or link instance, - * Create a new instance or find another linkable instance. - */ - - if (!handle || handle->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is not valid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Invalid handle\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common->id) { - ErrPrint("Handler is not valid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - /*! - * \note - * resize operation should be separated by each handle. - * If a handle is resizing, the other handle can request resize too. - * So we should not use the common->request.size_changed flag. - */ - if (handle->cbs.size_changed.cb) { - ErrPrint("Previous resize request is not finished yet\n"); - return WIDGET_ERROR_RESOURCE_BUSY; - } - - if (widget_service_get_size(type, &w, &h) != 0) { - ErrPrint("Invalid size type\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (handle->common->widget.width == w && handle->common->widget.height == h) { - DbgPrint("No changes\n"); - return WIDGET_ERROR_ALREADY_EXIST; - } - - if (!handle->common->is_user) { - ErrPrint("CA Livebox is not able to be resized\n"); - return WIDGET_ERROR_PERMISSION_DENIED; - } - - if (handle->common->refcnt <= 1) { - struct packet *packet; - unsigned int cmd = CMD_RESIZE; - - /* Only 1 instance */ - packet = packet_create((const char *)&cmd, "ssii", handle->common->pkgname, handle->common->id, w, h); - if (!packet) { - ErrPrint("Failed to build param\n"); - return WIDGET_ERROR_FAULT; - } - - if (!cb) { - cb = default_widget_size_changed_cb; - } - - ret = master_rpc_async_request(handle, packet, 0, resize_cb, NULL); - if (ret == (int)WIDGET_ERROR_NONE) { - handle->cbs.size_changed.cb = cb; - handle->cbs.size_changed.data = data; - handle->common->request.size_changed = 1; - } - } else { - common = _widget_find_sharable_common_handle(handle->common->pkgname, handle->common->content, w, h, handle->common->cluster, handle->common->category); - if (!common) { - struct widget_common *old_common; - /*! - * \note - * If the common handle is in resizing, - * if user tries to resize a hander, then simply create new one even if the requested size is same with this. - - if (handle->common->request.size_changed) { - } - - */ - - old_common = handle->common; - - common = _widget_create_common_handle(handle, old_common->pkgname, old_common->cluster, old_common->category); - if (!common) { - ErrPrint("Failed to create common handle\n"); - return WIDGET_ERROR_FAULT; - } - - _widget_set_size(common, w, h); - _widget_set_content(common, old_common->content); - _widget_set_period(common, old_common->widget.period); - - /*! - * \note - * Disconnecting from old one. - */ - if (_widget_common_unref(old_common, handle) == 0) { - /*! - * \note - * Impossible - */ - ErrPrint("Common has no associated handle\n"); - } - - _widget_common_ref(common, handle); - - /*! - * Connect to a new one - */ - handle->common = common; - - /*! - * \TODO - * Need to care, if it fails to create a common handle, - * the resize operation will be failed. - * in that case, we should reuse the old common handle - */ - ret = create_real_instance(handle, cb, data); - if (ret < 0) { - _widget_common_unref(common, handle); - _widget_destroy_common_handle(common); - - _widget_common_ref(old_common, handle); - handle->common = old_common; - } else { - /*! - * In this case, we should update visibility of old_common's widgetes - */ - if (handle->visible == WIDGET_SHOW) { - _widget_update_visibility(old_common); - } - } - } else { - struct cb_info *cbinfo; - - cbinfo = _widget_create_cb_info(cb, data); - if (!cbinfo) { - ErrPrint("Failed to create a cbinfo\n"); - ret = WIDGET_ERROR_OUT_OF_MEMORY; - } else { - ret = job_add(handle, _resize_job_cb, WIDGET_ERROR_NONE, cbinfo); - if (ret == (int)WIDGET_ERROR_NONE) { - struct widget_common *old_common; - - old_common = handle->common; - - if (_widget_common_unref(handle->common, handle) == 0) { - ErrPrint("Old common has no associated handle\n"); - } - - _widget_common_ref(common, handle); - handle->common = common; - - if (handle->visible == WIDGET_SHOW) { - _widget_update_visibility(old_common); /* To update visibility: Show --> Paused */ - _widget_update_visibility(common); /* To update visibility: Paused --> Show */ - } - } else { - _widget_destroy_cb_info(cbinfo); - } - } - } - } - - return ret; -} - -EAPI int widget_viewer_send_click_event(widget_h handle, const char *event, double x, double y) -{ - struct packet *packet; - double timestamp; - unsigned int cmd = CMD_CLICKED; - int ret; - - if (!handle || handle->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!event || (strcmp(event, WIDGET_VIEWER_CLICK_BUTTON_LEFT) && strcmp(event, WIDGET_VIEWER_CLICK_BUTTON_RIGHT) && strcmp(event, WIDGET_VIEWER_CLICK_BUTTON_CENTER))) { - ErrPrint("Unknown event: (%s)\n", event); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common->id) { - ErrPrint("Handler is not valid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (handle->common->widget.auto_launch) { - if (s_info.launch.handle) { - ret = s_info.launch.handle(handle, handle->common->widget.auto_launch, s_info.launch.data); - if (ret < 0) { - ErrPrint("launch handle app %s (%d)\n", handle->common->widget.auto_launch, ret); - } - } - } - - timestamp = util_timestamp(); - DbgPrint("CLICKED: %lf\n", timestamp); - - packet = packet_create_noack((const char *)&cmd, "sssddd", handle->common->pkgname, handle->common->id, event, timestamp, x, y); - if (!packet) { - ErrPrint("Failed to build param\n"); - return WIDGET_ERROR_FAULT; - } - - ret = master_rpc_request_only(handle, packet); - return ret; -} - -EAPI int widget_viewer_has_glance_bar(widget_h handle) -{ - if (!handle || handle->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common->id) { - ErrPrint("Handler is not valid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - return !!handle->common->gbar.fb; -} - -EAPI int widget_viewer_glance_bar_is_created(widget_h handle) -{ - if (!handle || handle->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common->gbar.fb || !handle->common->id) { - ErrPrint("Handler is not valid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - return handle->common->is_gbar_created; -} - -EAPI int widget_viewer_create_glance_bar(widget_h handle, double x, double y, widget_ret_cb cb, void *data) -{ - struct packet *packet; - unsigned int cmd = CMD_CREATE_GBAR; - int ret; - - if (!handle || handle->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common->gbar.fb || !handle->common->id) { - ErrPrint("Handler is not valid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - /*! - * \note - * Only one handle can have a GBAR - */ - if (handle->common->is_gbar_created) { - DbgPrint("GBAR is already created\n"); - return WIDGET_ERROR_NONE; - } - - if (handle->common->request.gbar_created) { - ErrPrint("Previous request is not completed yet\n"); - return WIDGET_ERROR_RESOURCE_BUSY; - } - - /*! - * \note - * Turn off the gbar_destroyed request flag - */ - if (handle->common->request.gbar_destroyed) { - if (job_add(handle, _turn_off_gbar_destroyed_flag_cb, WIDGET_ERROR_CANCELED, NULL) < 0) { - ErrPrint("Failed to add gbar_destroyed job\n"); - } - } - - packet = packet_create((const char *)&cmd, "ssdd", handle->common->pkgname, handle->common->id, x, y); - if (!packet) { - ErrPrint("Failed to build param\n"); - return WIDGET_ERROR_FAULT; - } - - if (!cb) { - cb = default_gbar_created_cb; - } - - DbgPrint("PERF_WIDGET\n"); - ret = master_rpc_async_request(handle, packet, 0, gbar_create_cb, NULL); - if (ret == (int)WIDGET_ERROR_NONE) { - handle->cbs.gbar_created.cb = cb; - handle->cbs.gbar_created.data = data; - handle->common->request.gbar_created = 1; - } - - return ret; -} - -EAPI int widget_viewer_move_glance_bar(widget_h handle, double x, double y) -{ - struct packet *packet; - unsigned int cmd = CMD_GBAR_MOVE; - - if (!handle || handle->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common->gbar.fb || !handle->common->id) { - ErrPrint("Handler is not valid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common->is_gbar_created) { - ErrPrint("GBAR is not created\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - packet = packet_create_noack((const char *)&cmd, "ssdd", handle->common->pkgname, handle->common->id, x, y); - if (!packet) { - ErrPrint("Failed to build param\n"); - return WIDGET_ERROR_FAULT; - } - - return master_rpc_request_only(handle, packet); -} - -EAPI int widget_viewer_activate_faulted_widget(const char *pkgname, widget_ret_cb cb, void *data) -{ - struct packet *packet; - struct cb_info *cbinfo; - unsigned int cmd = CMD_ACTIVATE_PACKAGE; - int ret; - - if (!pkgname) { - return WIDGET_ERROR_INVALID_PARAMETER; - } - - packet = packet_create((const char *)&cmd, "s", pkgname); - if (!packet) { - ErrPrint("Failed to build a param\n"); - return WIDGET_ERROR_FAULT; - } - - cbinfo = _widget_create_cb_info(cb, data); - if (!cbinfo) { - ErrPrint("Unable to create cbinfo\n"); - packet_destroy(packet); - return WIDGET_ERROR_FAULT; - } - - ret = master_rpc_async_request(NULL, packet, 0, activated_cb, cbinfo); - if (ret < 0) { - _widget_destroy_cb_info(cbinfo); - } - - return ret; -} - -EAPI int widget_viewer_destroy_glance_bar(widget_h handle, widget_ret_cb cb, void *data) -{ - struct packet *packet; - struct cb_info *cbinfo; - unsigned int cmd = CMD_DESTROY_GBAR; - int ret; - - if (!handle || handle->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common->gbar.fb || !handle->common->id) { - ErrPrint("Handler is not valid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - /*! - * \FIXME - * Replace the callback check code. - * Use the flag instead of callback. - * the flag should be in the ADT "common" - */ - if (!handle->common->is_gbar_created && !handle->common->request.gbar_created) { - ErrPrint("GBAR is not created\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (handle->common->request.gbar_destroyed) { - ErrPrint("GBAR destroy request is already sent\n"); - return WIDGET_ERROR_ALREADY_EXIST; - } - - /*! - * \note - * Disable the gbar_created request flag - */ - if (handle->common->request.gbar_created) { - if (job_add(handle, _turn_off_gbar_created_flag_cb, WIDGET_ERROR_CANCELED, NULL) < 0) { - ErrPrint("Failed to add a new job\n"); - } - } - - DbgPrint("[%s]\n", handle->common->pkgname); - - packet = packet_create((const char *)&cmd, "ss", handle->common->pkgname, handle->common->id); - if (!packet) { - ErrPrint("Failed to build a param\n"); - return WIDGET_ERROR_FAULT; - } - - if (!cb) { - cb = default_gbar_destroyed_cb; - } - - cbinfo = _widget_create_cb_info(cb, data); - if (!cbinfo) { - packet_destroy(packet); - return WIDGET_ERROR_FAULT; - } - - ret = master_rpc_async_request(handle, packet, 0, gbar_destroy_cb, cbinfo); - if (ret < 0) { - _widget_destroy_cb_info(cbinfo); - } else { - handle->common->request.gbar_destroyed = 1; - } - - return ret; -} - -EAPI int widget_viewer_feed_access_event(widget_h handle, widget_access_event_type_e type, widget_access_event_info_s info, widget_ret_cb cb, void *data) -{ - int w = 1; - int h = 1; - unsigned int cmd; - int ret = 0; /* re-used for sending event type */ - - if (!handle || handle->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common->id) { - ErrPrint("Handler is not valid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (handle->common->request.access_event) { - ErrPrint("Previous access event is not yet done\n"); - return WIDGET_ERROR_RESOURCE_BUSY; - } - - if (type & WIDGET_ACCESS_EVENT_GBAR_MASK) { - if (!handle->common->is_gbar_created) { - ErrPrint("GBAR is not created\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - w = handle->common->gbar.width; - h = handle->common->gbar.height; - - switch (type & ~(WIDGET_ACCESS_EVENT_GBAR_MASK | WIDGET_ACCESS_EVENT_WIDGET_MASK)) { - case WIDGET_ACCESS_EVENT_HIGHLIGHT: - cmd = CMD_GBAR_ACCESS_HL; - ret = (int)info->type; - break; - case WIDGET_ACCESS_EVENT_ACTIVATE: - cmd = CMD_GBAR_ACCESS_ACTIVATE; - break; - case WIDGET_ACCESS_EVENT_ACTION: - cmd = CMD_GBAR_ACCESS_ACTION; - ret = (int)info->type; - break; - case WIDGET_ACCESS_EVENT_SCROLL: - cmd = CMD_GBAR_ACCESS_SCROLL; - ret = (int)info->type; - break; - case WIDGET_ACCESS_EVENT_VALUE_CHANGE: - cmd = CMD_GBAR_ACCESS_VALUE_CHANGE; - break; - case WIDGET_ACCESS_EVENT_MOUSE: - cmd = CMD_GBAR_ACCESS_MOUSE; - ret = (int)info->type; - break; - case WIDGET_ACCESS_EVENT_BACK: - cmd = CMD_GBAR_ACCESS_BACK; - break; - case WIDGET_ACCESS_EVENT_OVER: - cmd = CMD_GBAR_ACCESS_OVER; - break; - case WIDGET_ACCESS_EVENT_READ: - cmd = CMD_GBAR_ACCESS_READ; - break; - case WIDGET_ACCESS_EVENT_ENABLE: - cmd = CMD_GBAR_ACCESS_ENABLE; - ret = info->type; - break; - default: - return WIDGET_ERROR_INVALID_PARAMETER; - } - - } else if (type & WIDGET_ACCESS_EVENT_WIDGET_MASK) { - w = handle->common->widget.width; - h = handle->common->widget.height; - switch (type & ~(WIDGET_ACCESS_EVENT_GBAR_MASK | WIDGET_ACCESS_EVENT_WIDGET_MASK)) { - case WIDGET_ACCESS_EVENT_HIGHLIGHT: - cmd = CMD_WIDGET_ACCESS_HL; - ret = (int)info->type; - break; - case WIDGET_ACCESS_EVENT_ACTIVATE: - cmd = CMD_WIDGET_ACCESS_ACTIVATE; - break; - case WIDGET_ACCESS_EVENT_ACTION: - cmd = CMD_WIDGET_ACCESS_ACTION; - ret = (int)info->type; - break; - case WIDGET_ACCESS_EVENT_SCROLL: - cmd = CMD_WIDGET_ACCESS_SCROLL; - ret = (int)info->type; - break; - case WIDGET_ACCESS_EVENT_VALUE_CHANGE: - cmd = CMD_WIDGET_ACCESS_VALUE_CHANGE; - break; - case WIDGET_ACCESS_EVENT_MOUSE: - cmd = CMD_WIDGET_ACCESS_MOUSE; - ret = (int)info->type; - break; - case WIDGET_ACCESS_EVENT_BACK: - cmd = CMD_WIDGET_ACCESS_BACK; - break; - case WIDGET_ACCESS_EVENT_OVER: - cmd = CMD_WIDGET_ACCESS_OVER; - break; - case WIDGET_ACCESS_EVENT_READ: - cmd = CMD_WIDGET_ACCESS_READ; - break; - case WIDGET_ACCESS_EVENT_ENABLE: - cmd = CMD_WIDGET_ACCESS_ENABLE; - ret = info->type; - break; - default: - return WIDGET_ERROR_INVALID_PARAMETER; - } - } else { - ErrPrint("Invalid event type\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!cb) { - cb = default_access_event_cb; - } - - ret = send_access_event(handle, (const char *)&cmd, info->x * w, info->y * h, ret); - if (ret == (int)WIDGET_ERROR_NONE) { - handle->cbs.access_event.cb = cb; - handle->cbs.access_event.data = data; - handle->common->request.access_event = 1; - } - - return ret; -} - -EAPI int widget_viewer_feed_mouse_event(widget_h handle, widget_mouse_event_type_e type, widget_mouse_event_info_s info) -{ - unsigned int cmd; - - if (!handle || handle->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common->id) { - ErrPrint("Handler is not valid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!(type & WIDGET_MOUSE_EVENT_MASK)) { - ErrPrint("Invalid content event is used\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (type & WIDGET_MOUSE_EVENT_GBAR_MASK) { - int flag = 1; - - if (!handle->common->is_gbar_created) { - ErrPrint("GBAR is not created\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common->gbar.fb) { - ErrPrint("Handler is not valid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (type & WIDGET_MOUSE_EVENT_MOVE) { - if (fabs(info->x - handle->common->gbar.x) < conf_event_filter() && fabs(info->y - handle->common->gbar.y) < conf_event_filter()) { - return WIDGET_ERROR_RESOURCE_BUSY; - } - } else if (type & WIDGET_MOUSE_EVENT_SET) { - flag = 0; - } - - if (flag) { - handle->common->gbar.x = info->x; - handle->common->gbar.y = info->y; - } - - switch ((type & ~(WIDGET_MOUSE_EVENT_GBAR_MASK | WIDGET_MOUSE_EVENT_WIDGET_MASK))) { - case WIDGET_MOUSE_EVENT_ENTER | WIDGET_MOUSE_EVENT_MASK: - cmd = CMD_GBAR_MOUSE_ENTER; - break; - case WIDGET_MOUSE_EVENT_LEAVE | WIDGET_MOUSE_EVENT_MASK: - cmd = CMD_GBAR_MOUSE_LEAVE; - break; - case WIDGET_MOUSE_EVENT_UP | WIDGET_MOUSE_EVENT_MASK: - cmd = CMD_GBAR_MOUSE_UP; - break; - case WIDGET_MOUSE_EVENT_DOWN | WIDGET_MOUSE_EVENT_MASK: - cmd = CMD_GBAR_MOUSE_DOWN; - break; - case WIDGET_MOUSE_EVENT_MOVE | WIDGET_MOUSE_EVENT_MASK: - cmd = CMD_GBAR_MOUSE_MOVE; - break; - case WIDGET_MOUSE_EVENT_SET | WIDGET_MOUSE_EVENT_MASK: - cmd = CMD_GBAR_MOUSE_SET; - break; - case WIDGET_MOUSE_EVENT_UNSET | WIDGET_MOUSE_EVENT_MASK: - cmd = CMD_GBAR_MOUSE_UNSET; - break; - case WIDGET_MOUSE_EVENT_ON_SCROLL | WIDGET_MOUSE_EVENT_MASK: - cmd = CMD_GBAR_MOUSE_ON_SCROLL; - break; - case WIDGET_MOUSE_EVENT_ON_HOLD | WIDGET_MOUSE_EVENT_MASK: - cmd = CMD_GBAR_MOUSE_ON_HOLD; - DbgPrint("Send ON_HOLD\n"); - break; - case WIDGET_MOUSE_EVENT_OFF_SCROLL | WIDGET_MOUSE_EVENT_MASK: - cmd = CMD_GBAR_MOUSE_OFF_SCROLL; - break; - case WIDGET_MOUSE_EVENT_OFF_HOLD | WIDGET_MOUSE_EVENT_MASK: - cmd = CMD_GBAR_MOUSE_OFF_HOLD; - break; - default: - ErrPrint("Invalid event type\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - } else if (type & WIDGET_MOUSE_EVENT_WIDGET_MASK) { - int flag = 1; - - if (!handle->common->widget.fb) { - ErrPrint("Handler is not valid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (handle->common->widget.auto_launch) { - return WIDGET_ERROR_DISABLED; - } - - if (type & WIDGET_MOUSE_EVENT_MOVE) { - if (fabs(info->x - handle->common->widget.x) < conf_event_filter() && fabs(info->y - handle->common->widget.y) < conf_event_filter()) { - return WIDGET_ERROR_RESOURCE_BUSY; - } - } else if (type & WIDGET_MOUSE_EVENT_SET) { - flag = 0; - } - - if (flag) { - handle->common->widget.x = info->x; - handle->common->widget.y = info->y; - } - - switch ((type & ~(WIDGET_MOUSE_EVENT_GBAR_MASK | WIDGET_MOUSE_EVENT_WIDGET_MASK))) { - case WIDGET_MOUSE_EVENT_ENTER | WIDGET_MOUSE_EVENT_MASK: - cmd = CMD_WIDGET_MOUSE_ENTER; - break; - case WIDGET_MOUSE_EVENT_LEAVE | WIDGET_MOUSE_EVENT_MASK: - cmd = CMD_WIDGET_MOUSE_LEAVE; - break; - case WIDGET_MOUSE_EVENT_UP | WIDGET_MOUSE_EVENT_MASK: - cmd = CMD_WIDGET_MOUSE_UP; - break; - case WIDGET_MOUSE_EVENT_DOWN | WIDGET_MOUSE_EVENT_MASK: - cmd = CMD_WIDGET_MOUSE_DOWN; - break; - case WIDGET_MOUSE_EVENT_MOVE | WIDGET_MOUSE_EVENT_MASK: - if (!handle->common->widget.mouse_event) { - return WIDGET_ERROR_INVALID_PARAMETER; - } - cmd = CMD_WIDGET_MOUSE_MOVE; - break; - case WIDGET_MOUSE_EVENT_SET | WIDGET_MOUSE_EVENT_MASK: - if (!handle->common->widget.mouse_event) { - return WIDGET_ERROR_INVALID_PARAMETER; - } - cmd = CMD_WIDGET_MOUSE_SET; - break; - case WIDGET_MOUSE_EVENT_UNSET | WIDGET_MOUSE_EVENT_MASK: - if (!handle->common->widget.mouse_event) { - return WIDGET_ERROR_INVALID_PARAMETER; - } - cmd = CMD_WIDGET_MOUSE_UNSET; - break; - case WIDGET_MOUSE_EVENT_ON_SCROLL | WIDGET_MOUSE_EVENT_MASK: - cmd = CMD_WIDGET_MOUSE_ON_SCROLL; - break; - case WIDGET_MOUSE_EVENT_ON_HOLD | WIDGET_MOUSE_EVENT_MASK: - cmd = CMD_WIDGET_MOUSE_ON_HOLD; - DbgPrint("Send ON_HOLD\n"); - break; - case WIDGET_MOUSE_EVENT_OFF_SCROLL | WIDGET_MOUSE_EVENT_MASK: - cmd = CMD_WIDGET_MOUSE_OFF_SCROLL; - break; - case WIDGET_MOUSE_EVENT_OFF_HOLD | WIDGET_MOUSE_EVENT_MASK: - cmd = CMD_WIDGET_MOUSE_OFF_HOLD; - break; - default: - ErrPrint("Invalid event type\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - } else { - ErrPrint("Invalid event type\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - return send_mouse_event(handle, (const char *)&cmd, info->x, info->y, info->ratio_w, info->ratio_h, info->device); -} - -EAPI int widget_viewer_feed_key_event(widget_h handle, widget_key_event_type_e type, widget_key_event_info_s info, widget_ret_cb cb, void *data) -{ - int ret; - unsigned int cmd; - - if (!handle || handle->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common->id) { - ErrPrint("Handler is not valid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!(type & WIDGET_KEY_EVENT_MASK)) { - ErrPrint("Invalid key event is used\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (handle->common->request.key_event) { - ErrPrint("Previous key event is not completed yet\n"); - return WIDGET_ERROR_RESOURCE_BUSY; - } - - if (type & WIDGET_MOUSE_EVENT_GBAR_MASK) { - if (!handle->common->is_gbar_created) { - ErrPrint("GBAR is not created\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common->gbar.fb) { - ErrPrint("Handler is not valid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (type & WIDGET_KEY_EVENT_DOWN) { - /*! - * \TODO - * filtering the reproduced events if it is too fast - */ - } else if (type & WIDGET_KEY_EVENT_SET) { - /*! - * \TODO - * What can I do for this case? - */ - } - - /*! - * Must be short than 29 bytes. - */ - switch ((type & ~(WIDGET_MOUSE_EVENT_GBAR_MASK | WIDGET_MOUSE_EVENT_WIDGET_MASK))) { - case WIDGET_KEY_EVENT_FOCUS_IN | WIDGET_KEY_EVENT_MASK: - cmd = CMD_GBAR_KEY_FOCUS_IN; - break; - case WIDGET_KEY_EVENT_FOCUS_OUT | WIDGET_KEY_EVENT_MASK: - cmd = CMD_GBAR_KEY_FOCUS_OUT; - break; - case WIDGET_KEY_EVENT_UP | WIDGET_KEY_EVENT_MASK: - cmd = CMD_GBAR_KEY_UP; - break; - case WIDGET_KEY_EVENT_DOWN | WIDGET_KEY_EVENT_MASK: - cmd = CMD_GBAR_KEY_DOWN; - break; - case WIDGET_KEY_EVENT_SET | WIDGET_KEY_EVENT_MASK: - cmd = CMD_GBAR_KEY_SET; - break; - case WIDGET_KEY_EVENT_UNSET | WIDGET_KEY_EVENT_MASK: - cmd = CMD_GBAR_KEY_UNSET; - break; - default: - ErrPrint("Invalid event type\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - } else if (type & WIDGET_MOUSE_EVENT_WIDGET_MASK) { - if (!handle->common->widget.fb) { - ErrPrint("Handler is not valid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (type & WIDGET_KEY_EVENT_DOWN) { - /*! - * \TODO - * filtering the reproduced events if it is too fast - */ - } else if (type & WIDGET_KEY_EVENT_SET) { - /*! - * What can I do for this case? - */ - } - - switch ((type & ~(WIDGET_MOUSE_EVENT_GBAR_MASK | WIDGET_MOUSE_EVENT_WIDGET_MASK))) { - case WIDGET_KEY_EVENT_FOCUS_IN | WIDGET_KEY_EVENT_MASK: - cmd = CMD_WIDGET_KEY_FOCUS_IN; - break; - case WIDGET_KEY_EVENT_FOCUS_OUT | WIDGET_KEY_EVENT_MASK: - cmd = CMD_WIDGET_KEY_FOCUS_OUT; - break; - case WIDGET_KEY_EVENT_UP | WIDGET_KEY_EVENT_MASK: - cmd = CMD_WIDGET_KEY_UP; - break; - case WIDGET_KEY_EVENT_DOWN | WIDGET_KEY_EVENT_MASK: - cmd = CMD_WIDGET_KEY_DOWN; - break; - case WIDGET_KEY_EVENT_SET | WIDGET_KEY_EVENT_MASK: - cmd = CMD_WIDGET_KEY_SET; - break; - case WIDGET_KEY_EVENT_UNSET | WIDGET_KEY_EVENT_MASK: - cmd = CMD_WIDGET_KEY_UNSET; - break; - default: - ErrPrint("Invalid event type\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - } else { - ErrPrint("Invalid event type\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!cb) { - cb = default_key_event_cb; - } - - ret = send_key_event(handle, (const char *)&cmd, info->keycode, info->device); - if (ret == (int)WIDGET_ERROR_NONE) { - handle->cbs.key_event.cb = cb; - handle->cbs.key_event.data = data; - handle->common->request.key_event = 1; - } - - return ret; -} - -EAPI const char *widget_viewer_get_filename(widget_h handle) -{ - if (!handle || handle->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - return NULL; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - return NULL; - } - - if (!handle->common->id) { - ErrPrint("Handler is not valid\n"); - return NULL; - } - - if (handle->common->filename) { - return handle->common->filename; - } - - /* Oooops */ - set_last_result(WIDGET_ERROR_NONE); - return util_uri_to_path(handle->common->id); -} - -EAPI int widget_viewer_get_glance_bar_size(widget_h handle, int *w, int *h) -{ - int _w; - int _h; - - if (!handle || handle->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common->id) { - ErrPrint("Handler is not valid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!w) { - w = &_w; - } - if (!h) { - h = &_h; - } - - if (!handle->common->is_gbar_created) { - *w = handle->common->gbar.default_width; - *h = handle->common->gbar.default_height; - } else { - *w = handle->common->gbar.width; - *h = handle->common->gbar.height; - } - - return WIDGET_ERROR_NONE; -} - -EAPI int widget_viewer_get_size_type(widget_h handle, widget_size_type_e *size_type) -{ - int w; - int h; - int ret = WIDGET_ERROR_NONE; - widget_size_type_e result_size_type = WIDGET_SIZE_TYPE_UNKNOWN; - - if (!handle || handle->state != WIDGET_STATE_CREATE || size_type == NULL) { - ErrPrint("Handler is invalid\n"); - ret = WIDGET_ERROR_INVALID_PARAMETER; - goto out; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - ret = WIDGET_ERROR_INVALID_PARAMETER; - goto out; - } - - if (!handle->common->id) { - ErrPrint("Handler is not valid\n"); - ret = WIDGET_ERROR_INVALID_PARAMETER; - goto out; - } - - w = handle->common->widget.width; - h = handle->common->widget.height; - - switch (handle->common->widget.type) { - case WIDGET_TYPE_BUFFER: - case WIDGET_TYPE_SCRIPT: - if (!fb_is_created(handle->common->widget.fb)) { - DbgPrint("FB is not created yet, but give its size to the caller: %dx%d\n", w, h); - } - break; - default: - break; - } - - if ((ret = widget_service_get_size_type(w, h, &result_size_type)) != WIDGET_ERROR_NONE) { - ErrPrint("widget_service_get_size_type failed : %d\n", ret); - goto out; - } - -out: - - if (size_type) { - *size_type = result_size_type; - } - - return ret; -} - -EAPI int widget_viewer_set_group(widget_h handle, const char *cluster, const char *category, widget_ret_cb cb, void *data) -{ - struct packet *packet; - unsigned int cmd = CMD_CHANGE_GROUP; - int ret; - - if (!handle) { - ErrPrint("Handler is NIL\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!cluster || !category || handle->state != WIDGET_STATE_CREATE) { - ErrPrint("Invalid argument\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Invalid argument\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common->id) { - ErrPrint("Invalid argument\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (handle->common->request.group_changed) { - ErrPrint("Previous group changing request is not finished yet\n"); - return WIDGET_ERROR_RESOURCE_BUSY; - } - - if (!handle->common->is_user) { - ErrPrint("CA Livebox is not able to change the group\n"); - return WIDGET_ERROR_PERMISSION_DENIED; - } - - if (!strcmp(handle->common->cluster, cluster) && !strcmp(handle->common->category, category)) { - DbgPrint("No changes\n"); - return WIDGET_ERROR_ALREADY_EXIST; - } - - packet = packet_create((const char *)&cmd, "ssss", handle->common->pkgname, handle->common->id, cluster, category); - if (!packet) { - ErrPrint("Failed to build a param\n"); - return WIDGET_ERROR_FAULT; - } - - if (!cb) { - cb = default_group_changed_cb; - } - - ret = master_rpc_async_request(handle, packet, 0, set_group_ret_cb, NULL); - if (ret == (int)WIDGET_ERROR_NONE) { - handle->cbs.group_changed.cb = cb; - handle->cbs.group_changed.data = data; - handle->common->request.group_changed = 1; - } - - return ret; -} - -EAPI int widget_viewer_get_group(widget_h handle, const char **cluster, const char **category) -{ - if (!handle) { - ErrPrint("Handler is NIL\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!cluster || !category || handle->state != WIDGET_STATE_CREATE) { - ErrPrint("Invalid argument\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Invalid argument\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common->id) { - ErrPrint("Invalid argument\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - *cluster = handle->common->cluster; - *category = handle->common->category; - return WIDGET_ERROR_NONE; -} - -EAPI int widget_viewer_get_supported_sizes(widget_h handle, int *cnt, widget_size_type_e *size_list) -{ - register int i; - register int j; - - if (!handle || !size_list) { - ErrPrint("Invalid argument, handle(%p), size_list(%p)\n", handle, size_list); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!cnt || handle->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is not valid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is not valid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common->id) { - ErrPrint("Handler is not valid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - for (j = i = 0; i < WIDGET_COUNT_OF_SIZE_TYPE; i++) { - if (handle->common->widget.size_list & (0x01 << i)) { - if (j == *cnt) { - break; - } - - size_list[j++] = (widget_size_type_e)(0x01 << i); - } - } - - *cnt = j; - return WIDGET_ERROR_NONE; -} - -EAPI const char *widget_viewer_get_pkgname(widget_h handle) -{ - if (!handle) { - ErrPrint("Handler is NIL\n"); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return NULL; - } - - if (handle->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is not valid\n"); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return NULL; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is not valid\n"); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return NULL; - } - - set_last_result(WIDGET_ERROR_NONE); - return handle->common->pkgname; -} - -EAPI int widget_viewer_get_priority(widget_h handle, double *priority) -{ - int ret = WIDGET_ERROR_NONE; - double result_priority = -1.0f; - - if (!handle || handle->state != WIDGET_STATE_CREATE || priority == NULL) { - ErrPrint("Handler is invalid\n"); - ret = WIDGET_ERROR_INVALID_PARAMETER; - goto out; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - ret = WIDGET_ERROR_INVALID_PARAMETER; - goto out; - } - - if (!handle->common->id) { - ErrPrint("Handler is not valid (%p)\n", handle); - ret = WIDGET_ERROR_INVALID_PARAMETER; - goto out; - } - - result_priority = handle->common->widget.priority; - -out: - if (priority) - *priority = result_priority; - - return ret; -} - -EAPI int widget_delete_cluster(const char *cluster, widget_ret_cb cb, void *data) -{ - struct packet *packet; - struct cb_info *cbinfo; - unsigned int cmd = CMD_DELETE_CLUSTER; - int ret; - - packet = packet_create((const char *)&cmd, "s", cluster); - if (!packet) { - ErrPrint("Failed to build a param\n"); - return WIDGET_ERROR_FAULT; - } - - cbinfo = _widget_create_cb_info(cb, data); - if (!cbinfo) { - packet_destroy(packet); - return WIDGET_ERROR_FAULT; - } - - ret = master_rpc_async_request(NULL, packet, 0, _delete_cluster_cb, cbinfo); - if (ret < 0) { - _widget_destroy_cb_info(cbinfo); - } - - return ret; -} - -EAPI int widget_delete_category(const char *cluster, const char *category, widget_ret_cb cb, void *data) -{ - struct packet *packet; - struct cb_info *cbinfo; - unsigned int cmd = CMD_DELETE_CATEGORY; - int ret; - - packet = packet_create((const char *)&cmd, "ss", cluster, category); - if (!packet) { - ErrPrint("Failed to build a param\n"); - return WIDGET_ERROR_FAULT; - } - - cbinfo = _widget_create_cb_info(cb, data); - if (!cbinfo) { - packet_destroy(packet); - return WIDGET_ERROR_FAULT; - } - - ret = master_rpc_async_request(NULL, packet, 0, _delete_category_cb, cbinfo); - if (ret < 0) { - _widget_destroy_cb_info(cbinfo); - } - - return ret; -} - -EAPI int widget_viewer_get_type(widget_h handle, int gbar, widget_type_e *widget_type) -{ - int ret = WIDGET_ERROR_INVALID_PARAMETER; - widget_type_e result_widget_type = WIDGET_CONTENT_TYPE_INVALID; - - if (!handle || handle->state != WIDGET_STATE_CREATE || widget_type == NULL) { - ErrPrint("Handler is invalid\n"); - ret = WIDGET_ERROR_INVALID_PARAMETER; - result_widget_type = WIDGET_CONTENT_TYPE_INVALID; - goto out; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - ret = WIDGET_ERROR_INVALID_PARAMETER; - result_widget_type = WIDGET_CONTENT_TYPE_INVALID; - goto out; - } - - if (!handle->common->id) { - ErrPrint("Handler is not valid\n"); - ret = WIDGET_ERROR_INVALID_PARAMETER; - result_widget_type = WIDGET_CONTENT_TYPE_INVALID; - goto out; - } - - if (gbar) { - switch (handle->common->gbar.type) { - case GBAR_TYPE_TEXT: - result_widget_type = WIDGET_CONTENT_TYPE_TEXT; - break; - case GBAR_TYPE_BUFFER: - case GBAR_TYPE_SCRIPT: - { - const char *id; - id = fb_id(handle->common->gbar.fb); - if (id && !strncasecmp(id, SCHEMA_PIXMAP, strlen(SCHEMA_PIXMAP))) { - result_widget_type = WIDGET_CONTENT_TYPE_RESOURCE_ID; - break; - } - } - result_widget_type = WIDGET_CONTENT_TYPE_BUFFER; - break; - case GBAR_TYPE_UIFW: - result_widget_type = WIDGET_CONTENT_TYPE_UIFW; - break; - default: - break; - } - } else { - switch (handle->common->widget.type) { - case WIDGET_TYPE_FILE: - result_widget_type = WIDGET_CONTENT_TYPE_IMAGE; - break; - case WIDGET_TYPE_BUFFER: - case WIDGET_TYPE_SCRIPT: - { - const char *id; - id = fb_id(handle->common->widget.fb); - if (id && !strncasecmp(id, SCHEMA_PIXMAP, strlen(SCHEMA_PIXMAP))) { - result_widget_type = WIDGET_CONTENT_TYPE_RESOURCE_ID; - break; - } - } - result_widget_type = WIDGET_CONTENT_TYPE_BUFFER; - break; - case WIDGET_TYPE_TEXT: - result_widget_type = WIDGET_CONTENT_TYPE_TEXT; - break; - case WIDGET_TYPE_UIFW: - result_widget_type = WIDGET_CONTENT_TYPE_UIFW; - break; - default: - break; - } - } - -out: - if (widget_type) - *widget_type = result_widget_type; - return ret; -} - -EAPI int widget_viewer_set_text_handler(widget_h handle, int gbar, struct widget_script_operators *ops) -{ - if (!handle) { - ErrPrint("Handler is NIL\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (handle->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is not valid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (gbar) { - memcpy(&handle->cbs.gbar_ops, ops, sizeof(*ops)); - } else { - memcpy(&handle->cbs.widget_ops, ops, sizeof(*ops)); - } - - return WIDGET_ERROR_NONE; -} - -EAPI int widget_viewer_acquire_extra_resource_id(widget_h handle, int gbar, int idx, widget_ret_cb cb, void *data) -{ - if (idx < 0) { - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle || handle->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common->id) { - ErrPrint("Invalid handle\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (gbar) { - /** - * This can be called from extra_resource_created event. - * and it can be called before get the created event. - * then we didn't know this handle's buffer type yet - * so we cannot use its type to validate handle - * - * handle->common.gbar.type == unknown - */ - if (!handle->common->gbar.extra_buffer) { - return WIDGET_ERROR_NOT_EXIST; - } - - if (idx >= conf_extra_buffer_count()) { - return WIDGET_ERROR_INVALID_PARAMETER; - } - - return widget_acquire_gbar_extra_pixmap(handle, idx, cb, data); - } else { - /** - * This can be called from extra_resource_created event. - * and it can be called before get the created event. - * then we didn't know this handle's buffer type yet - * so we cannot use its type to validate handle - * - * handle->common.widget.type == unknown - */ - if (!handle->common->widget.extra_buffer) { - ErrPrint("Extra buffer is not prepared\n"); - return WIDGET_ERROR_NOT_EXIST; - } - - if (idx >= conf_extra_buffer_count()) { - ErrPrint("Invalid parameter: %d / %d\n", idx, conf_extra_buffer_count()); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - return widget_acquire_widget_extra_pixmap(handle, idx, cb, data); - } -} - -EAPI int widget_viewer_acquire_resource_id(widget_h handle, int gbar, widget_ret_cb cb, void *data) -{ - if (!handle || handle->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common->id) { - ErrPrint("Invalid handle\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (gbar) { - if (handle->common->gbar.type != GBAR_TYPE_SCRIPT && handle->common->gbar.type != GBAR_TYPE_BUFFER) { - ErrPrint("Handler is not valid type\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - return widget_acquire_gbar_pixmap(handle, cb, data); - } else { - if (handle->common->widget.type != WIDGET_TYPE_SCRIPT && handle->common->widget.type != WIDGET_TYPE_BUFFER) { - ErrPrint("Handler is not valid type\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - return _widget_acquire_widget_pixmap(handle, cb, data); - } -} - -/*! - * \note - * Do not check the state of handle and common-handle. - * If this function is used in the deleted callback, - * the handle and common-handle's state would be DELETE - * if this function check the state of handles, - * user cannot release the pixmap. - */ -EAPI int widget_viewer_release_resource_id(widget_h handle, int gbar, unsigned int resource_id) -{ - struct packet *packet; - const char *pkgname; - const char *id; - unsigned int cmd; - - if (resource_id == 0 /* || handle->state != WIDGET_STATE_CREATE */) { - ErrPrint("Pixmap is invalid [%d]\n", resource_id); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (gbar) { - if (!handle) { - /*! - * \note - * Even though the handle is NULL, we should send the release request to the master. - * Because the resource_id resource can be released after the handle is destroyed. - * Pixmap resource is used by client. and it cannot be guaranteed to release resource_id. - * In some cases, the resource_id can be released after the handle is deleted. - * - * Its implementation is up to the viewer app. - * But we cannot force it to use only with valid handle. - */ - DbgPrint("Using NULL handle\n"); - pkgname = NULL; - id = NULL; - /*! - * \note - * Master will try to find the buffer handle using given resource_id. if the pkgname and id is not valid. - */ - } else { - if (!handle->common /* || handle-common->state != WIDGET_STATE_CREATE */) { - ErrPrint("Handler is invalid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common->id) { - ErrPrint("Invalid handle\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - /** - * This can be called from extra_resource_created event. - * and it can be called before get the created event. - * then we didn't know this handle's buffer type yet - * so we cannot use its type to validate handle - * - * handle->common.gbar.type == unknown - */ - - pkgname = handle->common->pkgname; - id = handle->common->id; - } - - cmd = CMD_GBAR_RELEASE_PIXMAP; - } else { - if (!handle) { - /*! - * \note - * Even though the handle is NULL, we should send the release request to the master. - * Because the resource_id resource can be released after the handle is destroyed. - * Pixmap resource is used by client. and it cannot be guaranteed to release resource_id. - * In some cases, the resource_id can be released after the handle is deleted. - * - * Its implementation is up to the viewer app. - * But we cannot force it to use only with valid handle. - */ - DbgPrint("Using NULL handle\n"); - pkgname = NULL; - id = NULL; - /*! - * \note - * Master will try to find the buffer handle using given resource_id. if the pkgname and id is not valid. - */ - } else { - if (!handle->common /* || handle->common->state != WIDGET_STATE_CREATE */) { - ErrPrint("Handler is invalid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common->id) { - ErrPrint("Invalid handle\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - /** - * This can be called from extra_resource_created event. - * and it can be called before get the created event. - * then we didn't know this handle's buffer type yet - * so we cannot use its type to validate handle - * - * handle->common.widget.type == unknown - */ - - pkgname = handle->common->pkgname; - id = handle->common->id; - } - - cmd = CMD_WIDGET_RELEASE_PIXMAP; - } - - packet = packet_create_noack((const char *)&cmd, "ssi", pkgname, id, resource_id); - if (!packet) { - ErrPrint("Failed to build a param\n"); - return WIDGET_ERROR_FAULT; - } - - return master_rpc_request_only(handle, packet); -} - -EAPI unsigned int widget_extra_resource_id(const widget_h handle, int gbar, int idx) -{ - if (idx < 0) { - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return 0u; - } - - if (!handle || handle->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return 0u; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return 0u; - } - - if (!handle->common->id) { - ErrPrint("Invalid handle\n"); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return 0u; - } - - if (gbar) { - /** - * This can be called from extra_resource_created event. - * and it can be called before get the created event. - * then we didn't know this handle's buffer type yet - * so we cannot use its type to validate handle - * - * handle->common.gbar.type == unknown - */ - - if (!handle->common->gbar.extra_buffer || handle->common->gbar.last_extra_buffer_idx < 0) { - set_last_result(WIDGET_ERROR_NOT_EXIST); - return 0u; - } - - return handle->common->gbar.extra_buffer[handle->common->gbar.last_extra_buffer_idx]; - } else { - /** - * This can be called from extra_resource_created event. - * and it can be called before get the created event. - * then we didn't know this handle's buffer type yet - * so we cannot use its type to validate handle - * - * handle->common.widget.type == unknown - */ - - if (!handle->common->widget.extra_buffer || handle->common->widget.last_extra_buffer_idx < 0) { - set_last_result(WIDGET_ERROR_NOT_EXIST); - return 0u; - } - - return handle->common->widget.extra_buffer[handle->common->widget.last_extra_buffer_idx]; - } -} - -EAPI int widget_viewer_get_resource_id(const widget_h handle, int gbar, unsigned int *resouce_id) -{ - const char *id; - unsigned int pixmap = 0u; - int ret = WIDGET_ERROR_NONE; - - if (!handle || handle->state != WIDGET_STATE_CREATE || resouce_id == NULL) { - ErrPrint("Handler is invalid\n"); - ret = WIDGET_ERROR_INVALID_PARAMETER; - goto out; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - ret = WIDGET_ERROR_INVALID_PARAMETER; - goto out; - } - - if (!handle->common->id) { - ErrPrint("Invalid handle\n"); - ret = WIDGET_ERROR_INVALID_PARAMETER; - goto out; - } - - if (gbar) { - if (handle->common->gbar.type != GBAR_TYPE_SCRIPT && handle->common->gbar.type != GBAR_TYPE_BUFFER) { - ErrPrint("Invalid handle\n"); - ret = WIDGET_ERROR_INVALID_PARAMETER; - goto out; - } - - id = fb_id(handle->common->gbar.fb); - if (id && sscanf(id, SCHEMA_PIXMAP "%u", &pixmap) != 1) { - ErrPrint("PIXMAP Id is not valid\n"); - ret = WIDGET_ERROR_INVALID_PARAMETER; - goto out; - } - } else { - if (handle->common->widget.type != WIDGET_TYPE_SCRIPT && handle->common->widget.type != WIDGET_TYPE_BUFFER) { - ErrPrint("Invalid handle\n"); - ret = WIDGET_ERROR_INVALID_PARAMETER; - goto out; - } - - id = fb_id(handle->common->widget.fb); - if (id && sscanf(id, SCHEMA_PIXMAP "%u", &pixmap) != 1) { - ErrPrint("PIXMAP Id is not valid\n"); - ret = WIDGET_ERROR_INVALID_PARAMETER; - goto out; - } - } -out: - if (resouce_id) - *resouce_id = pixmap; - - return ret; -} - -EAPI void *widget_viewer_acquire_buffer(widget_h handle, int gbar) -{ - if (!handle || handle->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return NULL; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return NULL; - } - - if (!handle->common->id) { - ErrPrint("Invalid handle\n"); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return NULL; - } - - if (gbar) { - if (handle->common->gbar.type != GBAR_TYPE_SCRIPT && handle->common->gbar.type != GBAR_TYPE_BUFFER) { - ErrPrint("Handler is not valid type\n"); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return NULL; - } - - return fb_acquire_buffer(handle->common->gbar.fb); - } else { - if (handle->common->widget.type != WIDGET_TYPE_SCRIPT && handle->common->widget.type != WIDGET_TYPE_BUFFER) { - ErrPrint("Handler is not valid type\n"); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return NULL; - } - - return fb_acquire_buffer(handle->common->widget.fb); - } -} - -EAPI int widget_viewer_release_buffer(void *buffer) -{ - return fb_release_buffer(buffer); -} - -EAPI int widget_viewer_get_buffer_reference_count(void *buffer) -{ - return fb_refcnt(buffer); -} - -EAPI int widget_viewer_get_buffer_size(widget_h handle, int gbar) -{ - if (!handle || handle->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common->id) { - ErrPrint("Invalid handle\n"); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (gbar) { - return fb_size(handle->common->gbar.fb); - } else { - return fb_size(handle->common->widget.fb); - } -} - -EAPI int widget_viewer_is_created_by_user(widget_h handle) -{ - if (!handle || handle->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common->id) { - ErrPrint("Invalid handle\n"); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - return handle->common->is_user; -} - -EAPI int widget_viewer_set_pinup(widget_h handle, int flag, widget_ret_cb cb, void *data) -{ - struct packet *packet; - unsigned int cmd = CMD_PINUP_CHANGED; - int ret; - - if (!handle || handle->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common->id) { - ErrPrint("Invalid handle\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (handle->common->request.pinup) { - ErrPrint("Previous pinup request is not finished\n"); - return WIDGET_ERROR_RESOURCE_BUSY; - } - - if (handle->common->is_pinned_up == flag) { - DbgPrint("No changes\n"); - return WIDGET_ERROR_ALREADY_EXIST; - } - - packet = packet_create((const char *)&cmd, "ssi", handle->common->pkgname, handle->common->id, flag); - if (!packet) { - ErrPrint("Failed to build a param\n"); - return WIDGET_ERROR_FAULT; - } - - if (!cb) { - cb = default_pinup_cb; - } - - ret = master_rpc_async_request(handle, packet, 0, pinup_done_cb, NULL); - if (ret == (int)WIDGET_ERROR_NONE) { - handle->cbs.pinup.cb = cb; - handle->cbs.pinup.data = data; - handle->common->request.pinup = 1; - } - - return ret; -} - -EAPI int widget_viewer_is_pinned_up(widget_h handle) -{ - if (!handle || handle->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common->id) { - ErrPrint("Invalid handle\n"); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - return handle->common->is_pinned_up; -} - -EAPI int widget_viewer_has_pinup(widget_h handle) -{ - if (!handle || handle->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common->id) { - ErrPrint("Invalid handle\n"); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - return handle->common->widget.pinup_supported; -} - -EAPI int widget_viewer_set_data(widget_h handle, void *data) -{ - if (!handle) { - ErrPrint("Handler is NIL\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (handle->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - handle->data = data; - return WIDGET_ERROR_NONE; -} - -EAPI void *widget_viewer_get_data(widget_h handle) -{ - if (!handle) { - ErrPrint("Handler is NIL\n"); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return NULL; - } - - if (handle->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return NULL; - } - - return handle->data; -} - -EAPI const char *widget_viewer_get_content_string(widget_h handle) -{ - if (!handle || handle->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return NULL; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Invalid handle\n"); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return NULL; - } - - set_last_result(WIDGET_ERROR_NONE); - return handle->common->content; -} - -EAPI const char *widget_viewer_get_title_string(widget_h handle) -{ - if (!handle || handle->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return NULL; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Invalid handle\n"); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return NULL; - } - - set_last_result(WIDGET_ERROR_NONE); - return handle->common->title; -} - -EAPI int widget_viewer_emit_text_signal(widget_h handle, widget_text_signal_s event_info, widget_ret_cb cb, void *data) -{ - struct packet *packet; - struct cb_info *cbinfo; - unsigned int cmd = CMD_TEXT_SIGNAL; - int ret; - const char *signal_name; - const char *source; - - if (!handle || handle->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (handle->common->widget.type != WIDGET_TYPE_TEXT && handle->common->gbar.type != GBAR_TYPE_TEXT) { - DbgPrint("Not a text box, but send signal\n"); - } - - if (!handle->common->id) { - ErrPrint("Handler is not valid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!event_info) { - ErrPrint("Invalid event info\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - signal_name = event_info->signal_name; - if (!signal_name) { - signal_name = ""; - } - - source = event_info->source; - if (!source) { - source = ""; - } - - packet = packet_create((const char *)&cmd, "ssssdddd", - handle->common->pkgname, handle->common->id, - signal_name, source, - event_info->geometry.sx, event_info->geometry.sy, - event_info->geometry.ex, event_info->geometry.ey); - if (!packet) { - ErrPrint("Failed to build a param\n"); - return WIDGET_ERROR_FAULT; - } - - cbinfo = _widget_create_cb_info(cb, data); - if (!cbinfo) { - packet_destroy(packet); - return WIDGET_ERROR_FAULT; - } - - ret = master_rpc_async_request(handle, packet, 0, text_signal_cb, cbinfo); - if (ret < 0) { - _widget_destroy_cb_info(cbinfo); - } - - return ret; -} - -EAPI int widget_viewer_subscribe_group(const char *cluster, const char *category) -{ - struct packet *packet; - unsigned int cmd = CMD_SUBSCRIBE; - - /*! - * \todo - * Validate the group info using DB - * If the group info is not valid, do not send this request - */ - - packet = packet_create_noack((const char *)&cmd, "ss", cluster ? cluster : "", category ? category : ""); - if (!packet) { - ErrPrint("Failed to create a packet\n"); - return WIDGET_ERROR_FAULT; - } - - return master_rpc_request_only(NULL, packet); -} - -EAPI int widget_viewer_unsubscribe_group(const char *cluster, const char *category) -{ - struct packet *packet; - unsigned int cmd = CMD_UNSUBSCRIBE; - - /*! - * \todo - * Validate the group info using DB - * If the group info is not valid, do not send this request - * AND Check the subscribed or not too - */ - - packet = packet_create_noack((const char *)&cmd, "ss", cluster ? cluster : "", category ? category : ""); - if (!packet) { - ErrPrint("Failed to create a packet\n"); - return WIDGET_ERROR_FAULT; - } - - return master_rpc_request_only(NULL, packet); -} - -EAPI int widget_viewer_subscribe_category(const char *category) -{ - struct packet *packet; - unsigned int cmd = CMD_SUBSCRIBE_CATEGORY; - - if (!category) { - return WIDGET_ERROR_INVALID_PARAMETER; - } - - packet = packet_create_noack((const char *)&cmd, "s", category); - if (!packet) { - ErrPrint("Failed to create a packet\n"); - return WIDGET_ERROR_FAULT; - } - - return master_rpc_request_only(NULL, packet); -} - -EAPI int widget_viewer_unsubscribe_category(const char *category) -{ - struct packet *packet; - unsigned int cmd = CMD_UNSUBSCRIBE_CATEGORY; - - if (!category) { - return WIDGET_ERROR_INVALID_PARAMETER; - } - - packet = packet_create_noack((const char *)&cmd, "s", category); - if (!packet) { - ErrPrint("Failed to create a packet\n"); - return WIDGET_ERROR_FAULT; - } - - return master_rpc_request_only(NULL, packet); -} - -EAPI int widget_viewer_refresh(widget_h handle, int force) -{ - struct packet *packet; - unsigned int cmd = CMD_UPDATE; - - if (!handle || handle->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is not valid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common->id) { - ErrPrint("Handler is not valid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - packet = packet_create_noack((const char *)&cmd, "ssi", handle->common->pkgname, handle->common->id, force); - if (!packet) { - ErrPrint("Failed to create a packet\n"); - return WIDGET_ERROR_FAULT; - } - - return master_rpc_request_only(handle, packet); -} - -EAPI int widget_viewer_refresh_group(const char *cluster, const char *category, int force) -{ - struct packet *packet; - unsigned int cmd = CMD_REFRESH_GROUP; - - if (!cluster || !category) { - ErrPrint("Invalid argument\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - packet = packet_create_noack((const char *)&cmd, "ssi", cluster, category, force); - if (!packet) { - ErrPrint("Failed to create a packet\n"); - return WIDGET_ERROR_FAULT; - } - - return master_rpc_request_only(NULL, packet); -} - -EAPI int widget_viewer_set_visibility(widget_h handle, widget_visible_state_e state) -{ - int old_state; - int ret; - - if (!handle || handle->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is not valid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common->id) { - ErrPrint("Handler is not valid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common->is_user) { - /* System cluster widget cannot be changed its visible states */ - if (state == WIDGET_HIDE_WITH_PAUSE) { - ErrPrint("CA Livebox is not able to change the visibility\n"); - return WIDGET_ERROR_PERMISSION_DENIED; - } - } - - if (handle->visible == state) { - DbgPrint("%s has no changes\n", handle->common->pkgname); - return WIDGET_ERROR_ALREADY_EXIST; - } - - old_state = handle->visible; - handle->visible = state; - - ret = _widget_set_visibility(handle, state); - if (ret < 0) { - handle->visible = old_state; - } - - return ret; -} - -EAPI widget_visible_state_e widget_viewer_get_visibility(widget_h handle) -{ - if (!handle || handle->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is invalid\n"); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return WIDGET_VISIBLE_ERROR; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is not valid\n"); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return WIDGET_VISIBLE_ERROR; - } - - if (!handle->common->id) { - ErrPrint("Handler is not valid\n"); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return WIDGET_VISIBLE_ERROR; - } - - return handle->visible; -} - -EAPI int widget_viewer_notify_paused_status_of_viewer(void) -{ - struct packet *packet; - unsigned int cmd = CMD_CLIENT_PAUSED; - - packet = packet_create_noack((const char *)&cmd, "d", util_timestamp()); - if (!packet) { - ErrPrint("Failed to create a pause packet\n"); - return WIDGET_ERROR_FAULT; - } - - return master_rpc_request_only(NULL, packet); -} - -EAPI int widget_viewer_notify_resumed_status_of_viewer(void) -{ - struct packet *packet; - unsigned int cmd = CMD_CLIENT_RESUMED; - - packet = packet_create_noack((const char *)&cmd, "d", util_timestamp()); - if (!packet) { - ErrPrint("Failed to create a resume packet\n"); - return WIDGET_ERROR_FAULT; - } - - return master_rpc_request_only(NULL, packet); -} - -EAPI int widget_viewer_notify_orientation_of_viewer(int orientation) -{ - struct packet *packet; - unsigned int cmd = CMD_ORIENTATION; - - if (orientation < 0 || orientation > 360) { - ErrPrint("Invalid parameter: %d\n", orientation); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - packet = packet_create_noack((const char *)&cmd, "di", util_timestamp(), orientation); - if (!packet) { - ErrPrint("Failed to create a orientation packet\n"); - return WIDGET_ERROR_FAULT; - } - - return master_rpc_request_only(NULL, packet); -} - -EAPI int widget_viewer_sync_buffer(widget_h handle, int gbar) -{ - if (!handle || handle->state != WIDGET_STATE_CREATE) { - ErrPrint("Invalid handle\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Invalid handle\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common->id) { - ErrPrint("Invalid handle\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (gbar) { - return _widget_sync_gbar_fb(handle->common); - } else { - return _widget_sync_widget_fb(handle->common); - } -} - -EAPI const char *widget_viewer_get_alternative_icon(widget_h handle) -{ - if (!handle || handle->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is not valid[%p]\n", handle); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return NULL; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is not valid\n"); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return NULL; - } - - return handle->common->alt.icon; -} - -EAPI const char *widget_viewer_get_alternative_name(widget_h handle) -{ - if (!handle || handle->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is not valid[%p]\n", handle); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return NULL; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is not valid\n"); - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - return NULL; - } - - return handle->common->alt.name; -} - -EAPI int widget_viewer_acquire_buffer_lock(widget_h handle, int is_gbar) -{ - int ret = WIDGET_ERROR_NONE; - - if (!handle || handle->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is not valid[%p]\n", handle); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Handler is not valid\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common->id) { - ErrPrint("Handler is not valid[%p]\n", handle); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (is_gbar) { - ret = widget_service_acquire_lock(handle->common->gbar.lock); - } else { - ret = widget_service_acquire_lock(handle->common->widget.lock); - } - - return ret == 0 ? WIDGET_ERROR_NONE : WIDGET_ERROR_FAULT; -} - -EAPI int widget_viewer_release_buffer_lock(widget_h handle, int is_gbar) -{ - int ret = WIDGET_ERROR_NONE; - - if (!handle || handle->state != WIDGET_STATE_CREATE) { - ErrPrint("Invalid handle\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Invalid handle\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common->id) { - ErrPrint("Handler is not valid[%p]\n", handle); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (is_gbar) { - ret = widget_service_release_lock(handle->common->gbar.lock); - } else { - ret = widget_service_release_lock(handle->common->widget.lock); - } - - return ret == 0 ? WIDGET_ERROR_NONE : WIDGET_ERROR_FAULT; -} - -EAPI int widget_viewer_set_option(widget_option_type_e option, int state) -{ - int ret = WIDGET_ERROR_NONE; - - switch (option) { - case WIDGET_OPTION_MANUAL_SYNC: - conf_set_manual_sync(state); - break; - case WIDGET_OPTION_FRAME_DROP_FOR_RESIZE: - conf_set_frame_drop_for_resizing(state); - break; - case WIDGET_OPTION_SHARED_CONTENT: - conf_set_shared_content(state); - break; - case WIDGET_OPTION_DIRECT_UPDATE: - if (s_info.init_count) { - DbgPrint("Already intialized, this option is not applied\n"); - } - conf_set_direct_update(state); - break; - case WIDGET_OPTION_EXTRA_BUFFER_CNT: - ErrPrint("Permission denied\n"); - ret = WIDGET_ERROR_PERMISSION_DENIED; - break; - default: - ret = WIDGET_ERROR_INVALID_PARAMETER; - break; - } - - return ret; -} - -EAPI int widget_viewer_get_option(widget_option_type_e option) -{ - int ret; - - set_last_result(WIDGET_ERROR_NONE); - switch (option) { - case WIDGET_OPTION_MANUAL_SYNC: - ret = conf_manual_sync(); - break; - case WIDGET_OPTION_FRAME_DROP_FOR_RESIZE: - ret = conf_frame_drop_for_resizing(); - break; - case WIDGET_OPTION_SHARED_CONTENT: - ret = conf_shared_content(); - break; - case WIDGET_OPTION_DIRECT_UPDATE: - ret = conf_direct_update(); - break; - case WIDGET_OPTION_EXTRA_BUFFER_CNT: - ret = conf_extra_buffer_count(); - break; - default: - ret = WIDGET_ERROR_INVALID_PARAMETER; - set_last_result(WIDGET_ERROR_INVALID_PARAMETER); - break; - } - - return ret; -} - -EAPI int widget_viewer_set_auto_launch_handler(widget_auto_launch_handler_cb widget_launch_handler, void *data) -{ - s_info.launch.handle = widget_launch_handler; - s_info.launch.data = data; - - return WIDGET_ERROR_NONE; -} - -EAPI int widget_viewer_get_damaged_region(widget_h handle, int gbar, const widget_damage_region_s *region) -{ - if (!handle || handle->state != WIDGET_STATE_CREATE) { - ErrPrint("Invalid handle\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Invalid handle\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common->id) { - ErrPrint("Handler is not valid[%p]\n", handle); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (gbar) { - region = &handle->common->widget.last_damage; - } else { - region = &handle->common->gbar.last_damage; - } - - return WIDGET_ERROR_NONE; -} - -EAPI int widget_viewer_get_affected_extra_buffer(widget_h handle, int gbar, int *idx, unsigned int *resource_id) -{ - int _idx; - unsigned int _resource_id; - - if (!handle || handle->state != WIDGET_STATE_CREATE) { - ErrPrint("Invalid handle\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Invalid handle\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common->id) { - ErrPrint("Handler is not valid[%p]\n", handle); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!idx) { - idx = &_idx; - } - - if (!resource_id) { - resource_id = &_resource_id; - } - - if (gbar) { - if (!handle->common->gbar.extra_buffer || handle->common->gbar.last_extra_buffer_idx < 0) { - return WIDGET_ERROR_NOT_EXIST; - } - - *idx = handle->common->gbar.last_extra_buffer_idx; - *resource_id = handle->common->gbar.extra_buffer[*idx]; - } else { - if (!handle->common->widget.extra_buffer || handle->common->widget.last_extra_buffer_idx < 0) { - return WIDGET_ERROR_NOT_EXIST; - } - - *idx = handle->common->widget.last_extra_buffer_idx; - *resource_id = handle->common->widget.extra_buffer[*idx]; - } - - return WIDGET_ERROR_NONE; -} - -EAPI int widget_viewer_get_instance_id(widget_h handle, char **instance_id) -{ - if (!handle || handle->state != WIDGET_STATE_CREATE || !instance_id) { - ErrPrint("Invalid handle\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common || handle->common->state != WIDGET_STATE_CREATE) { - ErrPrint("Invalid handle\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!handle->common->id) { - ErrPrint("Handler is not valid[%p]\n", handle); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - *instance_id = strdup(handle->common->id); - if (!*instance_id) { - ErrPrint("Out of memory: %d\n", errno); - return WIDGET_ERROR_OUT_OF_MEMORY; - } - - return WIDGET_ERROR_NONE; -} - -/* End of a file */ diff --git a/widget_viewer/src/widget_internal.c b/widget_viewer/src/widget_internal.c deleted file mode 100644 index acd4db6..0000000 --- a/widget_viewer/src/widget_internal.c +++ /dev/null @@ -1,1061 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include - -#include - -#include "dlist.h" -#include "debug.h" -#include "widget_viewer.h" -#include "widget_viewer_internal.h" -#include "fb.h" -#include "conf.h" -#include "util.h" -#include "master_rpc.h" - -int errno; - -typedef enum event_state { - INFO_STATE_CALLBACK_IN_IDLE = 0x00, - INFO_STATE_CALLBACK_IN_PROCESSING = 0x01 -} event_state_e; - -struct event_info { - int is_deleted; - int (*handler)(widget_h handler, widget_event_type_e event, void *data); - void *user_data; -}; - -struct fault_info { - int is_deleted; - int (*handler)(widget_fault_type_e event, const char *pkgname, const char *filename, const char *func, void *data); - void *user_data; -}; - -static struct info { - struct dlist *widget_common_list; - struct dlist *widget_list; - struct dlist *event_list; - struct dlist *fault_list; - event_state_e event_state; - event_state_e fault_state; -} s_info = { - .widget_common_list = NULL, - .widget_list = NULL, - .event_list = NULL, - .fault_list = NULL, - .event_state = INFO_STATE_CALLBACK_IN_IDLE, - .fault_state = INFO_STATE_CALLBACK_IN_IDLE, -}; - -static inline void default_delete_cb(widget_h handler, int ret, void *data) -{ - DbgPrint("Default deleted event handler: %d\n", ret); -} - -static void del_ret_cb(widget_h handler, const struct packet *result, void *data) -{ - struct cb_info *info = data; - int ret; - widget_ret_cb cb; - void *cbdata; - - cb = info->cb; - cbdata = info->data; - _widget_destroy_cb_info(info); - - if (!result) { - ErrPrint("Connection lost?\n"); - ret = WIDGET_ERROR_FAULT; - } else if (packet_get(result, "i", &ret) != 1) { - ErrPrint("Invalid argument\n"); - ret = WIDGET_ERROR_INVALID_PARAMETER; - } - - if (ret == 0) { - handler->cbs.deleted.cb = cb; - handler->cbs.deleted.data = cbdata; - } else if (cb) { - cb(handler, ret, cbdata); - } - - /*! - * \note - * Do not call the deleted callback from here. - * master will send the "deleted" event. - * Then invoke this callback. - * - * if (handler->cbs.deleted.cb) - * handler->cbs.deleted.cb(handler, ret, handler->cbs.deleted.data); - */ -} - -struct widget_common *_widget_create_common_handle(widget_h handle, const char *pkgname, const char *cluster, const char *category) -{ - struct widget_common *common; - - common = calloc(1, sizeof(*common)); - if (!common) { - ErrPrint("Heap: %d\n", errno); - set_last_result(WIDGET_ERROR_OUT_OF_MEMORY); - return NULL; - } - - common->pkgname = strdup(pkgname); - if (!common->pkgname) { - free(common); - set_last_result(WIDGET_ERROR_OUT_OF_MEMORY); - return NULL; - } - - common->cluster = strdup(cluster); - if (!common->cluster) { - ErrPrint("Error: %d\n", errno); - free(common->pkgname); - free(common); - set_last_result(WIDGET_ERROR_OUT_OF_MEMORY); - return NULL; - } - - common->category = strdup(category); - if (!common->category) { - ErrPrint("Error: %d\n", errno); - free(common->cluster); - free(common->pkgname); - free(common); - set_last_result(WIDGET_ERROR_OUT_OF_MEMORY); - return NULL; - } - - /* Data provider will set this */ - common->widget.type = WIDGET_TYPE_FILE; - common->gbar.type = GBAR_TYPE_SCRIPT; - - /* Used for handling the mouse event on a box */ - common->widget.mouse_event = 0; - - /* Cluster infomration is not determined yet */ - common->nr_of_sizes = 0x01; - - common->timestamp = util_timestamp(); - common->is_user = 1; - common->delete_type = WIDGET_DELETE_PERMANENTLY; - - common->gbar.lock = NULL; - common->gbar.last_extra_buffer_idx = WIDGET_UNKNOWN_BUFFER; - - common->widget.lock = NULL; - common->widget.last_extra_buffer_idx = WIDGET_UNKNOWN_BUFFER; - - common->state = WIDGET_STATE_CREATE; - common->visible = WIDGET_HIDE_WITH_PAUSE; - - s_info.widget_common_list = dlist_append(s_info.widget_common_list, common); - return common; -} - -int _widget_destroy_common_handle(struct widget_common *common) -{ - dlist_remove_data(s_info.widget_common_list, common); - - common->state = WIDGET_STATE_DESTROYED; - - if (common->filename) { - (void)util_unlink(common->filename); - } - - free(common->cluster); - free(common->category); - free(common->id); - free(common->pkgname); - free(common->filename); - free(common->widget.auto_launch); - free(common->alt.icon); - free(common->alt.name); - - if (common->widget.fb) { - fb_destroy(common->widget.fb); - common->widget.fb = NULL; - } - - if (common->gbar.fb) { - fb_destroy(common->gbar.fb); - common->gbar.fb = NULL; - } - - return 0; -} - -int _widget_common_ref(struct widget_common *common, widget_h handle) -{ - common->widget_list = dlist_append(common->widget_list, handle); - common->refcnt++; - - return common->refcnt; -} - -int _widget_common_unref(struct widget_common *common, widget_h handle) -{ - int refcnt; - dlist_remove_data(common->widget_list, handle); - refcnt = --common->refcnt; - - return refcnt; -} - -int _widget_set_group(struct widget_common *common, const char *cluster, const char *category) -{ - void *pc = NULL; - void *ps = NULL; - - if (cluster) { - pc = strdup(cluster); - if (!pc) { - ErrPrint("Heap: %d (cluster: %s)\n", errno, cluster); - return WIDGET_ERROR_OUT_OF_MEMORY; - } - } - - if (category) { - ps = strdup(category); - if (!ps) { - ErrPrint("Heap: %d (category: %s)\n", errno, category); - free(pc); - return WIDGET_ERROR_OUT_OF_MEMORY; - } - } - - if (common->cluster) { - free(common->cluster); - } - - if (common->category) { - free(common->category); - } - - common->cluster = pc; - common->category = ps; - - return WIDGET_ERROR_NONE; -} - -void _widget_set_size(struct widget_common *common, int w, int h) -{ - widget_size_type_e size_type; - - common->widget.width = w; - common->widget.height = h; - - widget_service_get_size_type(w, h, &size_type); - if (size_type != WIDGET_SIZE_TYPE_UNKNOWN) { - widget_service_get_need_of_mouse_event(common->pkgname, size_type, (bool*)&common->widget.mouse_event); - } -} - -void _widget_set_update_mode(struct widget_common *common, int active_mode) -{ - common->is_active_update = active_mode; -} - -void _widget_set_gbarsize(struct widget_common *common, int w, int h) -{ - common->gbar.width = w; - common->gbar.height = h; -} - -void _widget_set_default_gbarsize(struct widget_common *common, int w, int h) -{ - common->gbar.default_width = w; - common->gbar.default_height = h; -} - -void _widget_invoke_fault_handler(widget_fault_type_e event, const char *pkgname, const char *file, const char *func) -{ - struct dlist *l; - struct dlist *n; - struct fault_info *info; - - s_info.fault_state = INFO_STATE_CALLBACK_IN_PROCESSING; - - dlist_foreach_safe(s_info.fault_list, l, n, info) { - if (!info->is_deleted && info->handler(event, pkgname, file, func, info->user_data) == EXIT_FAILURE) { - info->is_deleted = 1; - } - - if (info->is_deleted) { - s_info.fault_list = dlist_remove(s_info.fault_list, l); - free(info); - } - } - - s_info.fault_state &= ~INFO_STATE_CALLBACK_IN_PROCESSING; -} - -void _widget_invoke_event_handler(widget_h handler, widget_event_type_e event) -{ - struct dlist *l; - struct dlist *n; - struct event_info *info; - - if (event == WIDGET_EVENT_WIDGET_UPDATED && handler->common->refcnt > 1) { - if (handler->visible != WIDGET_SHOW) { - DbgPrint("Update requested(pending) - %s\n", handler->common->pkgname); - handler->paused_updating++; - return; - } else { - handler->paused_updating = 0; - } - } - - s_info.event_state = INFO_STATE_CALLBACK_IN_PROCESSING; - - dlist_foreach_safe(s_info.event_list, l, n, info) { - if (!info->is_deleted && info->handler(handler, event, info->user_data) == EXIT_FAILURE) { - DbgPrint("Event handler returns EXIT_FAILURE\n"); - info->is_deleted = 1; - } - - if (info->is_deleted) { - s_info.event_list = dlist_remove(s_info.event_list, l); - free(info); - } - } - - s_info.event_state &= ~INFO_STATE_CALLBACK_IN_PROCESSING; -} - -struct widget_common *_widget_find_common_handle(const char *pkgname, const char *id) -{ - struct dlist *l; - struct widget_common *common; - - dlist_foreach(s_info.widget_common_list, l, common) { - if (!common->id) { - continue; - } - - if (!strcmp(common->pkgname, pkgname) && !strcmp(common->id, id)) { - return common; - } - } - - return NULL; -} - -struct widget_common *_widget_find_common_handle_by_timestamp(double timestamp) -{ - struct dlist *l; - struct widget_common *common; - - dlist_foreach(s_info.widget_common_list, l, common) { - if (common->timestamp == timestamp) { - return common; - } - } - - return NULL; -} - -widget_h _widget_new_widget(const char *pkgname, const char *id, double timestamp, const char *cluster, const char *category) -{ - widget_h handler; - - handler = calloc(1, sizeof(*handler)); - if (!handler) { - ErrPrint("Failed to create a new widget\n"); - return NULL; - } - - handler->common = _widget_create_common_handle(handler, pkgname, cluster, category); - if (!handler->common) { - ErrPrint("Heap: %d\n", errno); - free(handler); - return NULL; - } - - _widget_common_ref(handler->common, handler); - _widget_set_id(handler->common, id); - handler->common->timestamp = timestamp; - handler->common->state = WIDGET_STATE_CREATE; - handler->visible = WIDGET_HIDE_WITH_PAUSE; - handler->state = WIDGET_STATE_CREATE; - handler = _widget_ref(handler); - s_info.widget_list = dlist_append(s_info.widget_list, handler); - - return _widget_ref(handler); -} - -int _widget_delete_all(void) -{ - struct dlist *l; - struct dlist *n; - widget_h handler; - - dlist_foreach_safe(s_info.widget_list, l, n, handler) { - _widget_invoke_event_handler(handler, WIDGET_EVENT_DELETED); - _widget_unref(handler, 1); - } - - return WIDGET_ERROR_NONE; -} - -int _widget_set_content(struct widget_common *common, const char *content) -{ - char *pc = NULL; - - if (content) { - pc = strdup(content); - if (!pc) { - ErrPrint("heap: %d [%s]\n", errno, content); - return WIDGET_ERROR_OUT_OF_MEMORY; - } - } - - free(common->content); - common->content = pc; - return WIDGET_ERROR_NONE; -} - -int _widget_set_title(struct widget_common *common, const char *title) -{ - char *pt = NULL; - - if (title) { - pt = strdup(title); - if (!pt) { - ErrPrint("heap: %d [%s]\n", errno, title); - return WIDGET_ERROR_OUT_OF_MEMORY; - } - } - - free(common->title); - common->title = pt; - return WIDGET_ERROR_NONE; -} - -void _widget_set_size_list(struct widget_common *common, int size_list) -{ - common->widget.size_list = size_list; -} - -void _widget_set_auto_launch(struct widget_common *common, const char *auto_launch) -{ - char *pa = NULL; - - if (!auto_launch || !strlen(auto_launch)) { - return; - } - - pa = strdup(auto_launch); - if (!pa) { - ErrPrint("heap: %d, [%s]\n", errno, auto_launch); - return; - } - - free(common->widget.auto_launch); - common->widget.auto_launch = pa; -} - -void _widget_set_priority(struct widget_common *common, double priority) -{ - common->widget.priority = priority; -} - -void _widget_set_id(struct widget_common *common, const char *id) -{ - char *pi = NULL; - - if (id) { - pi = strdup(id); - if (!pi) { - ErrPrint("heap: %d [%s]\n", errno, pi); - return; - } - } - - free(common->id); - common->id = pi; -} - -void _widget_unlink_filename(struct widget_common *common) -{ - if (common->widget.type == WIDGET_TYPE_FILE || common->widget.type == WIDGET_TYPE_TEXT) { - if (common->filename && common->filename[0] && unlink(common->filename) < 0) { - ErrPrint("unlink: %d (%s)\n", errno, common->filename); - } - } -} - -void _widget_set_filename(struct widget_common *common, const char *filename) -{ - if (common->filename) { - free(common->filename); - } - - common->filename = strdup(filename); - if (!common->filename) { - ErrPrint("Heap: %d\n", errno); - } -} - -void _widget_set_alt_icon(struct widget_common *common, const char *icon) -{ - char *_icon = NULL; - - if (icon && strlen(icon)) { - _icon = strdup(icon); - if (!_icon) { - ErrPrint("Heap: %d\n", errno); - } - } - - free(common->alt.icon); - common->alt.icon = _icon; -} - -void _widget_set_alt_name(struct widget_common *common, const char *name) -{ - char *_name = NULL; - - if (name && strlen(name)) { - _name = strdup(name); - if (!_name) { - ErrPrint("Heap: %d\n", errno); - } - } - - free(common->alt.name); - common->alt.name = _name; -} - -int _widget_set_widget_fb(struct widget_common *common, const char *filename) -{ - struct fb_info *fb; - - if (!common) { - return WIDGET_ERROR_INVALID_PARAMETER; - } - - fb = common->widget.fb; - if (fb && !strcmp(fb_id(fb), filename)) { /*!< BUFFER is not changed, */ - return WIDGET_ERROR_NONE; - } - - common->widget.fb = NULL; - - if (!filename || filename[0] == '\0') { - if (fb) { - fb_destroy(fb); - } - return WIDGET_ERROR_NONE; - } - - common->widget.fb = fb_create(filename, common->widget.width, common->widget.height); - if (!common->widget.fb) { - ErrPrint("Faield to create a FB\n"); - if (fb) { - fb_destroy(fb); - } - return WIDGET_ERROR_FAULT; - } - - if (fb) { - fb_destroy(fb); - } - - return WIDGET_ERROR_NONE; -} - -int _widget_set_gbar_fb(struct widget_common *common, const char *filename) -{ - struct fb_info *fb; - - if (!common || common->state != WIDGET_STATE_CREATE) { - return WIDGET_ERROR_INVALID_PARAMETER; - } - - fb = common->gbar.fb; - if (fb && !strcmp(fb_id(fb), filename)) { - /* BUFFER is not changed, just update the content */ - return WIDGET_ERROR_ALREADY_EXIST; - } - common->gbar.fb = NULL; - - if (!filename || filename[0] == '\0') { - if (fb) { - fb_destroy(fb); - } - return WIDGET_ERROR_NONE; - } - - common->gbar.fb = fb_create(filename, common->gbar.width, common->gbar.height); - if (!common->gbar.fb) { - ErrPrint("Failed to create a FB\n"); - if (fb) { - fb_destroy(fb); - } - return WIDGET_ERROR_FAULT; - } - - if (fb) { - fb_destroy(fb); - } - return WIDGET_ERROR_NONE; -} - -struct fb_info *_widget_get_widget_fb(struct widget_common *common) -{ - return common->widget.fb; -} - -struct fb_info *_widget_get_gbar_fb(struct widget_common *common) -{ - return common->gbar.fb; -} - -void _widget_set_user(struct widget_common *common, int user) -{ - common->is_user = user; -} - -void _widget_set_pinup(struct widget_common *common, int pinup_supported) -{ - common->widget.pinup_supported = pinup_supported; -} - -void _widget_set_text_widget(struct widget_common *common) -{ - common->widget.type = WIDGET_TYPE_TEXT; -} - -void _widget_set_text_gbar(struct widget_common *common) -{ - common->gbar.type = GBAR_TYPE_TEXT; -} - -int _widget_text_widget(struct widget_common *common) -{ - return common->widget.type == WIDGET_TYPE_TEXT; -} - -int _widget_text_gbar(struct widget_common *common) -{ - return common->gbar.type == GBAR_TYPE_TEXT; -} - -void _widget_set_period(struct widget_common *common, double period) -{ - common->widget.period = period; -} - -widget_h _widget_ref(widget_h handler) -{ - if (!handler) { - return NULL; - } - - handler->refcnt++; - return handler; -} - -widget_h _widget_unref(widget_h handler, int destroy_common) -{ - if (!handler) { - return NULL; - } - - handler->refcnt--; - if (handler->refcnt > 0) { - return handler; - } - - if (handler->cbs.created.cb) { - handler->cbs.created.cb(handler, WIDGET_ERROR_FAULT, handler->cbs.created.data); - handler->cbs.created.cb = NULL; - handler->cbs.created.data = NULL; - } - - if (handler->cbs.deleted.cb) { - handler->cbs.deleted.cb(handler, WIDGET_ERROR_FAULT, handler->cbs.deleted.data); - handler->cbs.deleted.cb = NULL; - handler->cbs.deleted.data = NULL; - } - - if (handler->cbs.pinup.cb) { - handler->cbs.pinup.cb(handler, WIDGET_ERROR_FAULT, handler->cbs.pinup.data); - handler->cbs.pinup.cb = NULL; - handler->cbs.pinup.data = NULL; - } - - if (handler->cbs.group_changed.cb) { - handler->cbs.group_changed.cb(handler, WIDGET_ERROR_FAULT, handler->cbs.group_changed.data); - handler->cbs.group_changed.cb = NULL; - handler->cbs.group_changed.data = NULL; - } - - if (handler->cbs.period_changed.cb) { - handler->cbs.period_changed.cb(handler, WIDGET_ERROR_FAULT, handler->cbs.period_changed.data); - handler->cbs.period_changed.cb = NULL; - handler->cbs.period_changed.data = NULL; - } - - if (handler->cbs.size_changed.cb) { - handler->cbs.size_changed.cb(handler, WIDGET_ERROR_FAULT, handler->cbs.size_changed.data); - handler->cbs.size_changed.cb = NULL; - handler->cbs.size_changed.data = NULL; - } - - if (handler->cbs.gbar_created.cb) { - handler->cbs.gbar_created.cb(handler, WIDGET_ERROR_FAULT, handler->cbs.gbar_created.data); - handler->cbs.gbar_created.cb = NULL; - handler->cbs.gbar_created.data = NULL; - } - - if (handler->cbs.gbar_destroyed.cb) { - handler->cbs.gbar_destroyed.cb(handler, WIDGET_ERROR_FAULT, handler->cbs.gbar_destroyed.data); - handler->cbs.gbar_destroyed.cb = NULL; - handler->cbs.gbar_destroyed.data = NULL; - } - - if (handler->cbs.update_mode.cb) { - handler->cbs.update_mode.cb(handler, WIDGET_ERROR_FAULT, handler->cbs.update_mode.data); - handler->cbs.update_mode.cb = NULL; - handler->cbs.update_mode.data = NULL; - } - - if (handler->cbs.access_event.cb) { - handler->cbs.access_event.cb(handler, WIDGET_ACCESS_STATUS_ERROR, handler->cbs.access_event.data); - handler->cbs.access_event.cb = NULL; - handler->cbs.access_event.data = NULL; - } - - if (handler->cbs.key_event.cb) { - handler->cbs.key_event.cb(handler, WIDGET_KEY_STATUS_ERROR, handler->cbs.key_event.data); - handler->cbs.key_event.cb = NULL; - handler->cbs.key_event.data = NULL; - } - - dlist_remove_data(s_info.widget_list, handler); - - handler->state = WIDGET_STATE_DESTROYED; - if (_widget_common_unref(handler->common, handler) == 0) { - if (destroy_common) { - /*! - * \note - * Lock file should be deleted after all callbacks are processed. - */ - (void)widget_service_destroy_lock(handler->common->widget.lock, 0); - handler->common->widget.lock = NULL; - _widget_destroy_common_handle(handler->common); - } - } - free(handler); - DbgPrint("Handler is released\n"); - return NULL; -} - -int _widget_send_delete(widget_h handler, int type, widget_ret_cb cb, void *data) -{ - struct packet *packet; - struct cb_info *cbinfo; - int ret; - - if (handler->common->request.deleted) { - ErrPrint("Already in-progress\n"); - if (cb) { - cb(handler, WIDGET_ERROR_NONE, data); - } - return WIDGET_ERROR_RESOURCE_BUSY; - } - - if (!cb) { - cb = default_delete_cb; - } - - packet = packet_create("delete", "ssid", handler->common->pkgname, handler->common->id, type, handler->common->timestamp); - if (!packet) { - ErrPrint("Failed to build a param\n"); - if (cb) { - cb(handler, WIDGET_ERROR_FAULT, data); - } - - return WIDGET_ERROR_FAULT; - } - - cbinfo = _widget_create_cb_info(cb, data); - if (!cbinfo) { - packet_destroy(packet); - ErrPrint("Failed to create cbinfo\n"); - if (cb) { - cb(handler, WIDGET_ERROR_FAULT, data); - } - - return WIDGET_ERROR_FAULT; - } - - ret = master_rpc_async_request(handler, packet, 0, del_ret_cb, cbinfo); - if (ret < 0) { - /*! - * Packet is destroyed by master_rpc_async_request. - */ - _widget_destroy_cb_info(cbinfo); - - if (cb) { - cb(handler, WIDGET_ERROR_FAULT, data); - } - } else { - handler->common->request.deleted = 1; - } - - return ret; -} - -int _widget_sync_widget_fb(struct widget_common *common) -{ - int ret; - - if (fb_type(_widget_get_widget_fb(common)) == WIDGET_FB_TYPE_FILE) { - (void)widget_service_acquire_lock(common->widget.lock); - ret = fb_sync(_widget_get_widget_fb(common), common->widget.last_damage.x, common->widget.last_damage.y, common->widget.last_damage.w, common->widget.last_damage.h); - (void)widget_service_release_lock(common->widget.lock); - } else { - ret = fb_sync(_widget_get_widget_fb(common), common->widget.last_damage.x, common->widget.last_damage.y, common->widget.last_damage.w, common->widget.last_damage.h); - } - - return ret; -} - -int _widget_sync_gbar_fb(struct widget_common *common) -{ - int ret; - - if (fb_type(_widget_get_gbar_fb(common)) == WIDGET_FB_TYPE_FILE) { - (void)widget_service_acquire_lock(common->gbar.lock); - ret = fb_sync(_widget_get_gbar_fb(common), common->gbar.last_damage.x, common->gbar.last_damage.y, common->gbar.last_damage.w, common->gbar.last_damage.h); - (void)widget_service_release_lock(common->gbar.lock); - } else { - ret = fb_sync(_widget_get_gbar_fb(common), common->gbar.last_damage.x, common->gbar.last_damage.y, common->gbar.last_damage.w, common->gbar.last_damage.h); - } - - return ret; -} - -struct widget_common *_widget_find_sharable_common_handle(const char *pkgname, const char *content, int w, int h, const char *cluster, const char *category) -{ - struct dlist *l; - struct widget_common *common; - - if (!conf_shared_content()) { - /*! - * Shared content option is turnned off. - */ - return NULL; - } - - dlist_foreach(s_info.widget_common_list, l, common) { - if (common->state != WIDGET_STATE_CREATE) { - continue; - } - - if (strcmp(common->pkgname, pkgname)) { - continue; - } - - if (strcmp(common->cluster, cluster)) { - DbgPrint("Cluster mismatched\n"); - continue; - } - - if (strcmp(common->category, category)) { - DbgPrint("Category mismatched\n"); - continue; - } - - if (common->content && content) { - if (strcmp(common->content, content)) { - DbgPrint("%s Content ([%s] <> [%s])\n", common->pkgname, common->content, content); - continue; - } - } else { - int c1_len; - int c2_len; - - /*! - * \note - * We assumes "" (ZERO length string) to NULL - */ - c1_len = common->content ? strlen(common->content) : 0; - c2_len = content ? strlen(content) : 0; - if (c1_len != c2_len) { - DbgPrint("%s Content %p <> %p\n", common->pkgname, common->content, content); - continue; - } - } - - if (common->request.size_changed) { - DbgPrint("Changing size\n"); - /*! - * \note - * Do not re-use resizing instance. - * We will not use predicted size. - */ - continue; - } - - if (common->request.created) { - DbgPrint("Creating now but re-use it (%s)\n", common->pkgname); - } - - if (common->widget.width != w || common->widget.height != h) { - DbgPrint("Size mismatched\n"); - continue; - } - - DbgPrint("common handle is found: %p\n", common); - return common; - } - - return NULL; -} - -widget_h _widget_find_widget_in_show(struct widget_common *common) -{ - struct dlist *l; - widget_h item; - - dlist_foreach(common->widget_list, l, item) { - if (item->visible == WIDGET_SHOW) { - DbgPrint("%s visibility is not changed\n", common->pkgname); - return item; - } - } - - return NULL; -} - -widget_h _widget_get_widget_nth(struct widget_common *common, int nth) -{ - widget_h item; - struct dlist *l; - - l = dlist_nth(common->widget_list, nth); - item = dlist_data(l); - - return item; -} - -int _widget_add_event_handler(widget_event_handler_cb widget_cb, void *data) -{ - struct event_info *info; - info = malloc(sizeof(*info)); - if (!info) { - ErrPrint("Heap: %d\n", errno); - return WIDGET_ERROR_OUT_OF_MEMORY; - } - - info->handler = widget_cb; - info->user_data = data; - info->is_deleted = 0; - - s_info.event_list = dlist_append(s_info.event_list, info); - return WIDGET_ERROR_NONE; -} - -void *_widget_remove_event_handler(widget_event_handler_cb widget_cb) -{ - struct event_info *info; - struct dlist *l; - - dlist_foreach(s_info.event_list, l, info) { - if (info->handler == widget_cb) { - void *data; - - data = info->user_data; - - if (s_info.event_state == INFO_STATE_CALLBACK_IN_PROCESSING) { - info->is_deleted = 1; - } else { - s_info.event_list = dlist_remove(s_info.event_list, l); - free(info); - } - - return data; - } - } - - return NULL; -} - -int _widget_add_fault_handler(widget_fault_handler_cb widget_cb, void *data) -{ - struct fault_info *info; - info = malloc(sizeof(*info)); - if (!info) { - ErrPrint("Heap: %d\n", errno); - return WIDGET_ERROR_OUT_OF_MEMORY; - } - - info->handler = widget_cb; - info->user_data = data; - info->is_deleted = 0; - - s_info.fault_list = dlist_append(s_info.fault_list, info); - return WIDGET_ERROR_NONE; -} - -void *_widget_remove_fault_handler(widget_fault_handler_cb widget_cb) -{ - struct fault_info *info; - struct dlist *l; - - dlist_foreach(s_info.fault_list, l, info) { - if (info->handler == widget_cb) { - void *data; - - data = info->user_data; - - if (s_info.fault_state == INFO_STATE_CALLBACK_IN_PROCESSING) { - info->is_deleted = 1; - } else { - s_info.fault_list = dlist_remove(s_info.fault_list, l); - free(info); - } - - return data; - } - } - - return NULL; -} - -struct cb_info *_widget_create_cb_info(widget_ret_cb cb, void *data) -{ - struct cb_info *info; - - info = malloc(sizeof(*info)); - if (!info) { - ErrPrint("Heap: %d\n", errno); - return NULL; - } - - info->cb = cb; - info->data = data; - return info; -} - -void _widget_destroy_cb_info(struct cb_info *info) -{ - free(info); -} - -/* End of a file */ diff --git a/widget_viewer/widget_viewer.pc.in b/widget_viewer/widget_viewer.pc.in deleted file mode 100644 index 8e78cb2..0000000 --- a/widget_viewer/widget_viewer.pc.in +++ /dev/null @@ -1,12 +0,0 @@ -prefix=@PREFIX@ -exec_prefix=@EXEC_PREFIX@ -libdir=@LIBDIR@ -includedir=@INCLUDEDIR@ - -Name: widget-viewer -Description: Support development of the widget Viewer -Version: @VERSION@ -Requires: widget_service -Libs: -L${libdir} -lwidget_viewer -Cflags: -I${includedir} -cppflags: -I${includedir} diff --git a/widget_viewer_evas/CMakeLists.txt b/widget_viewer_evas/CMakeLists.txt index cb4cd17..6111238 100644 --- a/widget_viewer_evas/CMakeLists.txt +++ b/widget_viewer_evas/CMakeLists.txt @@ -25,20 +25,6 @@ SET(BUILD_SOURCE src/widget_viewer_evas.c ) -IF (X11_SUPPORT) -SET(BUILD_SOURCE - ${BUILD_SOURCE} - src/util_x11.c -) -ENDIF (X11_SUPPORT) - -IF (WAYLAND_SUPPORT) -SET(BUILD_SOURCE - ${BUILD_SOURCE} - src/util_wayland.c -) -ENDIF (WAYLAND_SUPPORT) - FOREACH(flag ${viewer_evas_CFLAGS}) SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") ENDFOREACH(flag) @@ -56,13 +42,12 @@ ADD_DEFINITIONS("-DWIDGET_EVAS_RESOURCE_PO=\"${LOCALEDIR}\"") ADD_DEFINITIONS("-DPKGNAME=\"${PROJECT_NAME}\"") INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include) -INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/widget_viewer/include) 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} ${viewer_evas_LDFLAGS} "-lpthread" widget_viewer) +TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${viewer_evas_LDFLAGS} "-lpthread") CONFIGURE_FILE(${PROJECT_NAME}.pc.in ${PROJECT_NAME}.pc @ONLY) SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${PROJECT_NAME}.pc") @@ -70,7 +55,6 @@ SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${PROJECT_NAME} INSTALL(TARGETS ${PROJECT_NAME} DESTINATION ${LIB_INSTALL_DIR}) INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc DESTINATION ${LIB_INSTALL_DIR}/pkgconfig) INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/${PROJECT_NAME}.h DESTINATION include/${PROJECT_NAME}) -INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/${PROJECT_NAME}_internal.h DESTINATION include/${PROJECT_NAME}) INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE DESTINATION /usr/share/license RENAME "lib${PROJECT_NAME}") ADD_SUBDIRECTORY(res) diff --git a/widget_viewer_evas/include/util.h b/widget_viewer_evas/include/util.h deleted file mode 100644 index 2bb06dd..0000000 --- a/widget_viewer_evas/include/util.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Samsung API - * Copyright (c) 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 __WIDGET_VIEWER_UTIL_H -#define __WIDGET_VIEWER_UTIL_H - -extern int util_screen_size_get(int *w, int *h); -extern unsigned int util_replace_native_surface(struct widget *handle, int gbar, Evas_Object *content, unsigned int pixmap); -extern int util_set_native_surface(struct widget *handle, int gbar, Evas_Object *content, unsigned int pixmap, int skip_acquire); -extern unsigned int util_get_resource_id_of_native_surface(Evas_Native_Surface *surface); -extern void *util_display_get(void); - -#endif - -/* End of a file */ diff --git a/widget_viewer_evas/include/widget_viewer_evas_internal.h b/widget_viewer_evas/include/widget_viewer_evas_internal.h deleted file mode 100644 index 5faae3b..0000000 --- a/widget_viewer_evas/include/widget_viewer_evas_internal.h +++ /dev/null @@ -1,279 +0,0 @@ -/* - * Samsung API - * Copyright (c) 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 __WIDGET_VIEWER_EVAS_INTERNAL_H -#define __WIDGET_VIEWER_EVAS_INTERNAL_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include "widget_viewer_evas.h" -#include "widget_service_internal.h" - -#define WIDGET_SMART_SIGNAL_GBAR_DESTROYED "gbar,destroyed" /**< GBAR is destroyed */ -#define WIDGET_SMART_SIGNAL_GBAR_ABORTED "gbar,aborted" /**< GBAR creation is aborted */ -#define WIDGET_SMART_SIGNAL_GBAR_CREATED "gbar,created" /**< GBAR is created */ -#define WIDGET_SMART_SIGNAL_FLICKDOWN_CANCELLED "flickdown,cancelled" /**< Flick down is canceld */ - - -#define WIDGET_VIEWER_EVAS_SHARED_CONTENT 0x0002 /**< Multiple instances will share the content of one real instance */ -#define WIDGET_VIEWER_EVAS_SUPPORT_GBAR 0x0004 /**< GBAR will be used */ - -#define WIDGET_VIEWER_EVAS_DISABLE_SCROLLER 0x4000 - -typedef enum widget_access_result { - WIDGET_ACCESS_RESULT_DONE = 0x00, - WIDGET_ACCESS_RESULT_FIRST = 0x01, - WIDGET_ACCESS_RESULT_LAST = 0x02, - WIDGET_ACCESS_RESULT_READ = 0x04, - WIDGET_ACCESS_RESULT_ERROR = 0x80, - WIDGET_ACCESS_RESULT_UNKNOWN = 0xFF -} widget_access_result_e; - -/** - * @since_tizen 2.3.1 - * @brief event type for evas raw event - */ -typedef enum widget_evas_raw_event_type { - WIDGET_VIEWER_EVAS_RAW_DELETE = 0x00, - WIDGET_VIEWER_EVAS_RAW_CREATE = 0x02, - WIDGET_VIEWER_EVAS_RAW_MAX = 0xff, -} widget_evas_raw_event_type_e; - -/** - * @since_tizen 2.3.1 - * @brief Options for each widget. - */ -typedef enum widget_option_widget_type { - WIDGET_OPTION_WIDGET_DELAYED_RESUME = 0x01, /**< 0: Follow the global configuration, 1: Disable the Delayed Pause Resume, 2: Enable the Delayed Pause Resume */ - WIDGET_OPTION_WIDGET_DISABLE_OVERLAY_ANIMATION = 0x02, /**< 0: Enable overlay animation, 1: Disable overlay animation */ - WIDGET_OPTION_WIDGET_MANUAL_OVERLAY_HIDE = 0x04, /**< 0: Automatically hidden by system, 1: Should be hidden by caller explicitly */ - WIDGET_OPTION_UNKNOWN = 0xFF -} widget_option_widget_e; - -/** - * @since_tizen 2.3.1 - * @brief Data structure for smart callback user parameter - */ -typedef struct widget_evas_raw_event_info { - const char *pkgname; - enum widget_evas_raw_event_type type; - int error; - Evas_Object *widget; -} widget_evas_raw_event_info_s; - -/** - * @brief Close the Glance Bar if it is opened - * @since_tizen 2.3.1 - * @param[in] widget widget object - * @return 0 on success, otherwise a negative error value - */ -extern int widget_viewer_evas_destroy_glance_bar(Evas_Object *widget); - -/** - * @brief Set the viewe port of given widget - * @since_tizen 2.3.1 - * @param[in] widget - * @param[in] x - * @param[in] y - * @param[in] w - * @param[in] h - * @return 0 on success, otherwise a negative error value - */ -extern int widget_viewer_evas_set_view_port(Evas_Object *widget, int x, int y, int w, int h); - -/** - * @brief Get the current view port of given widget - * @since_tizen 2.3.1 - * @param[in] widget - * @param[out] x - * @param[out] y - * @param[out] w - * @param[out] h - * @return 0 on success, otherwise a negative error value - */ -extern int widget_viewer_evas_get_view_port(Evas_Object *widget, int *x, int *y, int *w, int *h); - - -/** - * @brief Feeds accessibility events - * @since_tizen 2.3.1 - * @param[in] widget - * @param[in] type - * @param[in] info - * @param[in] ret_cb - * @param[in] dta - * @return 0 on success, otherwise a negative error value - */ -extern int widget_viewer_evas_feed_access_event(Evas_Object *widget, int type, void *info, void (*ret_cb)(Evas_Object *obj, int ret, void *data), void *data); - -/** - * @brief Dump a contents of widget to a given filename. - * @since_tizen 2.3.1 - * @param[in] widget widget object - * @param[in] filename Filename will be used for saving content of a widget - * @return 0 on success, otherwise a negative error value - */ -extern int widget_viewer_evas_dump_to_file(Evas_Object *widget, const char *filename); - - -/** - * @brief Subscribes an event for widgets only in a given cluster and sub-cluster. - * @details If you wrote a view-only client, - * you can receive the event of specific widgets which belong to a given cluster/category. - * But you cannot modify their attributes (such as size, ...). - * @since_tizen 2.3.1 - * @privlevel public - * @privilege %http://tizen.org/privilege/widget.viewer - * @param[in] cluster Cluster ("*" can be used for subscribe all cluster's widgets event; If you use the "*", value in the category will be ignored) - * @param[in] category Category ("*" can be used for subscribe widgets events of all category(sub-cluster) in a given "cluster") - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_ERROR_FAULT Unrecoverable error occurred - * @retval #WIDGET_ERROR_NONE Successfully requested - * @see widget_viewer_evas_unsubscribe_group() - */ -extern int widget_viewer_evas_subscribe_group(const char *cluster, const char *sub_cluster); - - -/** - * @brief Unsubscribes an event for the widgets, but you will receive already added widgets events. - * @since_tizen 2.3.1 - * @privlevel public - * @privilege %http://tizen.org/privilege/widget.viewer - * @param[in] cluster Cluster("*" can be used for subscribe all cluster's widgets event; If you use the "*", value in the category will be ignored) - * @param[in] category Category ("*" can be used for subscribe all sub-cluster's widgets event in a given "cluster") - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_ERROR_FAULT Unrecoverable error occurred - * @retval #WIDGET_ERROR_NONE Successfully requested - * @see widget_subscribe_group() - */ -extern int widget_viewer_evas_unsubscribe_group(const char *cluster, const char *sub_cluster); - -/** - * @brief Subscribes events of widgets which is categorized by given "category" string. - * "category" is written in the XML file of each widget manifest file. - * After subscribe the category, the master will send created event for all created widgets, - * Also it will notify client when a new widget is created. - * @since_tizen 2.3.1 - * @privlevel public - * @privilege %http://tizen.org/privilege/widget.viewer - * @param[in] category Category name - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_ERROR_FAULT Unrecoverable error occurred - * @retval #WIDGET_ERROR_NONE Successfully requested - * @see widget_viewer_evas_unsubscribe_category() - */ -extern int widget_viewer_evas_subscribe_category(const char *category); - -/** - * @brief Unsubscribes events of widgets. - * @since_tizen 2.3.1 - * @privlevel public - * @privilege %http://tizen.org/privilege/widget.viewer - * @param[in] category Category name - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_ERROR_FAULT Unrecoverable error occurred - * @retval #WIDGET_ERROR_NONE Successfully requested - * @see widget_viewer_evas_subscribe_category() - */ -extern int widget_viewer_evas_unsubscribe_category(const char *category); - -/** - * @brief Callback function for handling raw event - * @since_tizen 2.3.1 - * @param[in] info - * @param[in] data - */ -typedef void (*raw_event_cb)(widget_evas_raw_event_info_s *info, void *data); - -/** - * @brief Register a callback function for subscribing raw event. - * @since_tizen 2.3.1 - * @param[in] type - * @param[in] cb - * @param[in] data - */ -extern int widget_viewer_evas_set_raw_event_callback(widget_evas_raw_event_type_e type, raw_event_cb cb, void *data); - -/** - * @brief Unregister a callback function for subscribing raw event. - * @since_tizen 2.3.1 - * @param[in] type - * @param[in] cb - * @param[in] data - * @return 0 on success, otherwise a negative error value - */ -extern int widget_viewer_evas_unset_raw_event_callback(widget_evas_raw_event_type_e type, raw_event_cb cb, void *data); - -extern int widget_viewer_evas_get_instance_id(Evas_Object *widget, char **instance_id); - -extern int widget_viewer_evas_set_widget_option(Evas_Object *widget, widget_option_widget_e option, int value); - -/** - * @brief Emits a text signal to the given widget - * @since_tizen 2.3.1 - * @privlevel public - * @privilege %http://tizen.org/privilege/widget.viewer - * @remarks - * This is an ASYNCHRONOUS API. - * This function is Asynchronous, so you will get the result from @a smart callback, if you failed to send a text signal, - * this function will returns proper error code. - * @param[in] widget a widget object - * @param[in] event_info.signal_name name of text signal - * @param[in] event_info.source source string - * @param[in] event_info.sx Start X - * @param[in] event_info.sy Start Y - * @param[in] event_info.ex End X - * @param[in] event_info.ey End Y - * @return 0 on success, otherwise a negative error value - * @retval #WIDGET_STATUS_ERROR_NONE Successfully emitted - * @retval #WIDGET_STATUS_ERROR_INVALID_PARAMETER Invalid parameters - * @retval #WIDGET_STATUS_ERROR_FAULT Unrecoverable error occurred - * @see #widget_text_signal_s - * @see #WIDGET_TEXT_SIGNAL_NAME_EDIT_MODE_ON - * @see #WIDGET_TEXT_SIGNAL_NAME_EDIT_MODE_OFF - */ -extern int widget_viewer_evas_emit_text_signal(Evas_Object *widget, widget_text_signal_s event_info, void *data); - -/** - * @brief Set the preview image file - * @since_tizen 2.3.1 - * @privlevel public - * @privilege %http://tizen.org/privilege/widget.viewer - * @param[in] widget - * @param[in] preview - * @return #WIDGET_ERROR_NONE on success, otherwise a negative error value - */ -extern int widget_viewer_evas_set_preview_image(Evas_Object *widget, widget_size_type_e type, const char *preview); - -/** - * @brief Hide the overlay (preview) immeidiately. - * @since_tizen 2.3.1 - * @privlevel public - * @privilege %http://tizen.org/privilege/widget.viewer - * @param[in] widget - * @return #WIDGET_ERROR_NONE on success, otherwise negative error value - */ -extern int widget_viewer_evas_hide_overlay(Evas_Object *widget); - -extern int widget_viewer_evas_hide_faulted_overlay_once(Evas_Object *widget); -#ifdef __cplusplus -} -#endif - -#endif /* __WIDGET_VIEWER_EVAS_INTERNAL_H */ diff --git a/widget_viewer_evas/src/util_wayland.c b/widget_viewer_evas/src/util_wayland.c deleted file mode 100644 index 3257e5c..0000000 --- a/widget_viewer_evas/src/util_wayland.c +++ /dev/null @@ -1,35 +0,0 @@ -#include -#include - -#include -#include - -int util_screen_size_get(int *x, int *y) -{ - *x = 0; - *y = 0; - - return 0; -} - -unsigned int util_replace_native_surface(struct widget *handle, int gbar, Evas_Object *content, unsigned int pixmap) -{ - return 0u; -} - -int util_set_native_surface(struct widget *handle, int gbar, Evas_Object *content, unsigned int pixmap, int skip_acquire) -{ - return 1; -} - -unsigned int util_get_resource_id_of_native_surface(Evas_Native_Surface *surface) -{ - return 0u; -} - -void *util_display_get(void) -{ - return NULL; -} - -/* End of a file */ diff --git a/widget_viewer_evas/src/util_x11.c b/widget_viewer_evas/src/util_x11.c deleted file mode 100644 index b614a1c..0000000 --- a/widget_viewer_evas/src/util_x11.c +++ /dev/null @@ -1,107 +0,0 @@ -#include -#include - -#include - -#include - -#include -#include - -#include "debug.h" - -int util_screen_size_get(int *w, int *h) -{ - int _w; - int _h; - - if (!w) { - w = &_w; - } - - if (!h) { - h = &_h; - } - - ecore_x_window_size_get(0, w, h); - return 0; -} - -unsigned int util_replace_native_surface(struct widget *handle, int gbar, Evas_Object *content, unsigned int pixmap) -{ - Evas_Native_Surface *old_surface; - Evas_Native_Surface surface; - unsigned int old_pixmap = 0u; - - surface.version = EVAS_NATIVE_SURFACE_VERSION; - surface.type = EVAS_NATIVE_SURFACE_X11; - surface.data.x11.pixmap = pixmap; - - old_surface = evas_object_image_native_surface_get(content); - if (!old_surface) { - surface.data.x11.visual = ecore_x_default_visual_get(ecore_x_display_get(), ecore_x_default_screen_get()); - - evas_object_image_native_surface_set(content, &surface); - - DbgPrint("Created: %u\n", surface.data.x11.pixmap); - } else { - old_pixmap = old_surface->data.x11.pixmap; - - if (old_pixmap != pixmap) { - surface.data.x11.visual = old_surface->data.x11.visual; - evas_object_image_native_surface_set(content, &surface); - DbgPrint("Replaced: %u (%u)\n", pixmap, old_pixmap); - } else { - DbgPrint("Same resource, reuse it [%u]\n", pixmap); - old_pixmap = 0u; - } - } - - return old_pixmap; -} - -int util_set_native_surface(struct widget *handle, int gbar, Evas_Object *content, unsigned int pixmap, int skip_acquire) -{ - Evas_Native_Surface *old_surface; - Evas_Native_Surface surface; - int is_first = 0; - - surface.version = EVAS_NATIVE_SURFACE_VERSION; - surface.type = EVAS_NATIVE_SURFACE_X11; - surface.data.x11.pixmap = (unsigned int)pixmap; - - old_surface = evas_object_image_native_surface_get(content); - if (!old_surface) { - surface.data.x11.visual = ecore_x_default_visual_get(ecore_x_display_get(), ecore_x_default_screen_get()); - evas_object_image_native_surface_set(content, &surface); - - is_first = 1; - } else { - unsigned int old_pixmap = 0u; - old_pixmap = old_surface->data.x11.pixmap; - surface.data.x11.visual = old_surface->data.x11.visual; - evas_object_image_native_surface_set(content, &surface); - - if (old_pixmap) { - if (!skip_acquire) { - widget_viewer_release_resource_id(handle, gbar, old_pixmap); - } - } - - is_first = 0; - } - - return is_first; -} - -unsigned int util_get_resource_id_of_native_surface(Evas_Native_Surface *surface) -{ - return surface ? surface->data.x11.pixmap : 0u; -} - -void *util_display_get(void) -{ - return ecore_x_display_get(); -} - -/* End of a file */ diff --git a/widget_viewer_evas/src/widget_viewer_evas.c b/widget_viewer_evas/src/widget_viewer_evas.c index c7e72bc..2e3f418 100644 --- a/widget_viewer_evas/src/widget_viewer_evas.c +++ b/widget_viewer_evas/src/widget_viewer_evas.c @@ -31,9 +31,6 @@ #include #include -#include -#include -#include #include "util.h" @@ -44,7 +41,6 @@ #include #include "widget_viewer_evas.h" -#include "widget_viewer_evas_internal.h" #if !defined(WIDGET_COUNT_OF_SIZE_TYPE) #define WIDGET_COUNT_OF_SIZE_TYPE 13 @@ -98,10 +94,6 @@ #define WIDGET_VIEWER_EVAS_UNKNOWN "/usr/share/widget_viewer_evas/res/image/unknown.png" #endif -#if !defined(WIDGET_VIEWER_EVAS_RESOURCE_GBAR) -#define WIDGET_VIEWER_EVAS_RESOURCE_GBAR "gbar" -#endif - #if !defined(WIDGET_VIEWER_EVAS_RESOURCE_LB) #define WIDGET_VIEWER_EVAS_RESOURCE_LB "widget" #endif @@ -125,22 +117,6 @@ #define DEFAULT_CLUSTER "user,created" #define DEFAULT_CATEGORY "default" -/** - * @note - * Supported touch devices are limited to 32. - * Because of count of bits of integer type. (32 bits) - */ -#define MAX_DEVICE 32 - -#define IS_PRESSED(info, device) (((device) < MAX_DEVICE) ? (((info)->pressed & (0x01 << (device))) == (0x01 << (device))) : 0) - -/** - * @note - * Short-Circuit - */ -#define SET_PRESSED(info, device) ((void)(((device) < MAX_DEVICE) && (((info)->pressed |= (0x01 << (device)))))) -#define SET_RELEASED(info, device) ((void)(((device) < MAX_DEVICE) && (((info)->pressed &= (~(0x01 << (device))))))) - /*! * \note * Enable this to apply shadow effect to image object (for text widget) @@ -149,7596 +125,99 @@ int errno; -/*! - * \note - * Detect click event if the pointer does moved in this region (x , y < 5 pixels) - */ -#define CLICK_REGION WIDGET_CONF_CLICK_REGION - -#if defined(__LP64__) || defined(_LP64) -#define PTR_TYPE(a) ((long long)(a)) -#else -#define PTR_TYPE(a) ((int)(a)) -#endif - -static struct { - Evas_Smart_Class sc; - Evas_Smart *smart; - Eina_List *list; - struct { - Eina_List *delete_list; - Eina_List *create_list; - } raw_event; - int screen_width; - int screen_height; - - union _conf { - struct _field { - unsigned int user_view_port:1; - unsigned int force_to_buffer:1; - unsigned int support_gbar:1; - unsigned int manual_pause_resume:1; - unsigned int use_fixed_size:1; - unsigned int easy_mode:1; - unsigned int is_scroll_x:1; - unsigned int is_scroll_y:1; - unsigned int auto_feed:1; - unsigned int delayed_resume:1; - unsigned int sensitive_move:1; - unsigned int render_animator:1; - unsigned int auto_render_selector:1; - unsigned int skip_acquire:1; - unsigned int disable_internal_scroller: 1; - - unsigned int reserved:17; - } field; - unsigned int mask; - } conf; - - Evas_Object *win; - Ecore_Animator *renderer; - Eina_List *widget_dirty_objects; - Eina_List *gbar_dirty_objects; - Eina_List *subscribed_category_list; - Eina_List *subscribed_group_list; - Eina_List *updated_pixmap_list; - Eina_List *updated_pixmap_lock_list; - - int initialized; -} s_info = { - .sc = EVAS_SMART_CLASS_INIT_NAME_VERSION(WIDGET_CLASS_NAME), - .smart = NULL, - .list = NULL, - .raw_event = { - .delete_list = NULL, - .create_list = NULL, - }, - .conf = { - .mask = 0, - }, - .screen_width = 720, - .screen_height = 1280, - .win = NULL, - .renderer = NULL, - .widget_dirty_objects = NULL, - .gbar_dirty_objects = NULL, - .subscribed_category_list = NULL, - .subscribed_group_list = NULL, - .updated_pixmap_list = NULL, - .updated_pixmap_lock_list = NULL, - .initialized = 0, -}; - -struct subscribe_group { - char *cluster; - char *sub_cluster; -}; - -struct subscribe_category { - char *category; -}; - -struct access_ret_cb_data { - Evas_Object *obj; - void (*ret_cb)(Evas_Object *, int, void *); - void *data; -}; - -struct acquire_data { - struct widget_data *data; - Evas_Object *content; - int w; - int h; -}; - -enum CANCEL_CLICK { - CANCEL_DISABLED = 0x0, - CANCEL_USER = 0x01, - CANCEL_PROCESSED = 0x02 -}; - -struct preview_info { - widget_size_type_e type; - char *preview; -}; - -struct widget_data { - enum { - WIDGET_DATA_CREATED = 0x00beef00, - WIDGET_DATA_DELETED = 0x0d0e0a0d, - } state; - struct widget *handle; - Evas *e; - Evas_Object *stage; /*!< Do not resize this directly, it should be resized via XX_update_geometry */ - Evas_Object *parent; - - Evas_Object *widget_layout; /*!< Layout of widget content part */ - Evas_Object *gbar_layout; /*!< Layout of GBAR content part */ - - Evas_Object *widget; /*!< Container object */ - - struct view_port { - int x; - int y; - int w; - int h; - } view_port; - - char *widget_id; - char *content; - char *cluster; - char *category; - double period; - - void *widget_fb; - void *gbar_fb; - - unsigned int gbar_pixmap; - unsigned int widget_pixmap; - - unsigned int *gbar_extra; - unsigned int *widget_extra; - int gbar_extra_cnt; - int widget_extra_cnt; - - int widget_latest_idx; /* -1 = primary buffer, 0 ~ = extra buffer */ - int gbar_latest_idx; /* -1 = primary buffer, 0 ~ = extra buffer */ - - struct _down { - int x; - int y; - - struct _geo { - int x; - int y; - } geo; - - int is_gbar; - } down; - - int x[MAX_DEVICE]; - int y[MAX_DEVICE]; - - int widget_width; - int widget_height; - int fixed_width; - int fixed_height; - widget_size_type_e size_type; - unsigned int pressed; /**< Mouse is pressed */ - - union { - struct { - unsigned int touch_effect:1; /**< Requires to play touch effect */ - unsigned int mouse_event:1; /**< Requires to feed mouse event */ - unsigned int scroll_x:1; /**< */ - unsigned int scroll_y:1; - unsigned int faulted:1; - unsigned int flick_down:1; - unsigned int gbar_created:1; - - unsigned int created:1; - unsigned int deleted:1; - unsigned int widget_pixmap_acquire_requested:1; - unsigned int gbar_pixmap_acquire_requested:1; - unsigned int cancel_scroll_x:1; - unsigned int cancel_scroll_y:1; - unsigned int cancel_click:2; - unsigned int disable_preview:1; - unsigned int disable_loading:1; - unsigned int disable_text:1; - unsigned int widget_overlay_loaded:1; - unsigned int gbar_overlay_loaded:1; - - unsigned int freeze_visibility:1; - - unsigned int widget_dirty:1; - unsigned int gbar_dirty:1; - - unsigned int send_delete:1; - unsigned int permanent_delete:1; - - unsigned int delayed_resume:2; - unsigned int initial_resumed:1; - - unsigned int disabled_overlay_animation:1; - unsigned int extra_info_updated:1; - - unsigned int hide_overlay_manually:1; - - /** - * @note - * Do not raise up the overlay for faulted. - */ - unsigned int hide_faulted_overlay: 1; - } field; /* Do we really have the performance loss because of bit fields? */ - - unsigned int flags; - } is; - - int refcnt; - int overlay_update_counter; - Ecore_Timer *overlay_timer; - widget_visibility_status_e freezed_visibility; - - Eina_List *gbar_script_object_list; - Eina_List *widget_script_object_list; - - Ecore_Timer *delayed_resume_timer; - - Eina_List *preview_list; -}; - -struct script_object { - char *id; - Evas_Object *obj; - Evas_Object *parent; /* Swallowee object : Before delete 'obj', it should be unswallowed from this object */ -}; - -enum EFFECT_MASK { - EFFECT_NONE = 0x0, - EFFECT_WIDTH = 0x01, - EFFECT_HEIGHT = 0x02, - EFFECT_BOTH = 0x03, - EFFECT_MOVE = 0x10 -}; - -struct animation_data { - Ecore_Timer *timer; - Evas_Object *obj; - - unsigned int effect_mask; - int w; - int h; - int x; - int y; -}; - -struct raw_event_cbdata { - void (*cb)(struct widget_evas_raw_event_info *info, void *data); - void *data; -}; - -struct image_option { - int orient; - int aspect; - enum { - FILL_DISABLE, - FILL_IN_SIZE, - FILL_OVER_SIZE, - FILL_FIT_SIZE - } fill; - - struct shadow { - int enabled; - int angle; - int offset; - int softness; - int color; - } shadow; - - int width; - int height; -}; - -static int widget_fault_handler(enum widget_fault_type fault, const char *pkgname, const char *filename, const char *funcname, void *data); -static int widget_event_handler(struct widget *handle, enum widget_event_type event, void *data); - -static int widget_system_created(struct widget *handle, struct widget_data *data); -static void __widget_created_cb(struct widget *handle, int ret, void *cbdata); -static void __widget_overlay_loading(struct widget_data *data); -static void __widget_overlay_faulted(struct widget_data *data); -static void __widget_overlay_disable(struct widget_data *data, int no_timer, int ignore_update_count); - -static void gbar_overlay_loading(struct widget_data *data); -static void gbar_overlay_disable(struct widget_data *data); - -static void update_widget_geometry(struct acquire_data *acquire_data); -static void update_gbar_geometry(struct acquire_data *acquire_data); -static void update_stage_geometry(struct acquire_data *acquire_data); -static void animator_del_cb(void *cbdata, Evas *e, Evas_Object *obj, void *event_info); - -static void remove_widget_dirty_object_list(struct widget_data *data); -static void remove_gbar_dirty_object_list(struct widget_data *data); -static void append_widget_dirty_object_list(struct widget_data *data, int idx); -static void append_gbar_dirty_object_list(struct widget_data *data, int idx); -static void __widget_event_widget_updated(struct widget_data *data); -static void __widget_event_gbar_updated(struct widget_data *data); - -static inline bool is_widget_feature_enabled(void) -{ - static bool feature = false; - static bool retrieved = false; - - if (retrieved == false) { - int ret; - - ret = system_info_get_platform_bool("http://tizen.org/feature/shell.appwidget", &feature); - if (ret != SYSTEM_INFO_ERROR_NONE) { - ErrPrint("system_info: %d\n", ret); - } else { - retrieved = true; - } - } - - return feature; -} - -static char *get_preview_image(struct widget_data *data, widget_size_type_e type) -{ - Eina_List *l; - struct preview_info *info; - char *preview; - - EINA_LIST_FOREACH(data->preview_list, l, info) { - if (info->type == type) { - preview = strdup(info->preview); - if (!preview) { - ErrPrint("strdup: %d\n", errno); - } - return preview; - } - } - - return widget_service_get_preview_image_path(data->widget_id, type); -} - -static struct widget_data *get_smart_data(Evas_Object *widget) -{ - if (widget && evas_object_smart_type_check(widget, WIDGET_CLASS_NAME)) { - struct widget_data *data; - - data = evas_object_smart_data_get(widget); - if (data) { - if (data->state == WIDGET_DATA_CREATED) { - return data; - } - - ErrPrint("smart data is not valid\n"); - } else { - ErrPrint("smart data is not exists\n"); - } - } - - return NULL; -} - -static struct widget_data *get_smart_data_from_handle(widget_h handle) -{ - Evas_Object *widget; - - widget = widget_viewer_get_data(handle); - if (!widget) { - return NULL; - } - - return get_smart_data(widget); -} - -static Evas_Object *find_script_object(struct widget_data *data, int gbar, const char *id) -{ - Eina_List *script_object_list; - struct script_object *so; - Eina_List *l; - - if (gbar) { - if (!data->gbar_layout) { - return NULL; - } - - script_object_list = data->gbar_script_object_list; - } else { - if (!data->widget_layout) { - return NULL; - } - - script_object_list = data->widget_script_object_list; - } - - if (!id) { - so = eina_list_nth(script_object_list, 0); - return so ? so->obj : NULL; - } - - EINA_LIST_FOREACH(script_object_list, l, so) { - if (so->id && !strcmp(so->id, id)) { - return so->obj; - } - } - - return NULL; -} - -static void gbar_script_del_cb(void *cbdata, Evas *e, Evas_Object *obj, void *event_info) -{ - struct widget_data *data = cbdata; - Eina_List *l; - Eina_List *n; - struct script_object *so; - - EINA_LIST_FOREACH_SAFE(data->gbar_script_object_list, l, n, so) { - if (so->obj == obj) { - data->gbar_script_object_list = eina_list_remove(data->gbar_script_object_list, so); - free(so->id); - free(so); - break; - } - } -} - -static void __widget_script_del_cb(void *cbdata, Evas *e, Evas_Object *obj, void *event_info) -{ - struct widget_data *data = cbdata; - Eina_List *l; - Eina_List *n; - struct script_object *so; - - EINA_LIST_FOREACH_SAFE(data->widget_script_object_list, l, n, so) { - if (so->obj == obj) { - data->widget_script_object_list = eina_list_remove(data->widget_script_object_list, so); - free(so->id); - free(so); - break; - } - } -} - -static void script_signal_forwarder(void *cbdata, Evas_Object *obj, const char *signal_name, const char *source) -{ - struct widget_data *data = cbdata; - struct widget_text_signal event_info = { - .signal_name = signal_name, - .source = source, - .geometry = { - .sx = 0.0f, - .sy = 0.0f, - .ex = 1.0f, - .ey = 1.0f, - } - }; - - widget_viewer_emit_text_signal(data->handle, &event_info, NULL, NULL); -} - -static int append_script_object(struct widget_data *data, int gbar, const char *id, Evas_Object *parent, Evas_Object *child) -{ - struct script_object *so; - - so = malloc(sizeof(*so)); - if (!so) { - ErrPrint("malloc: %d\n", errno); - return WIDGET_ERROR_OUT_OF_MEMORY; - } - - if (id) { - so->id = strdup(id); - if (!so->id) { - ErrPrint("strdup: %d\n", errno); - free(so); - return WIDGET_ERROR_OUT_OF_MEMORY; - } - } else { - so->id = NULL; - } - - so->obj = child; - so->parent = parent; - - if (gbar) { - data->gbar_script_object_list = eina_list_append(data->gbar_script_object_list, so); - evas_object_event_callback_add(child, EVAS_CALLBACK_DEL, gbar_script_del_cb, data); - } else { - data->widget_script_object_list = eina_list_append(data->widget_script_object_list, so); - evas_object_event_callback_add(child, EVAS_CALLBACK_DEL, __widget_script_del_cb, data); - } - - elm_object_signal_callback_add(child, "*", "*", script_signal_forwarder, data); - return WIDGET_ERROR_NONE; -} - -static inline void reset_scroller(struct widget_data *data) -{ - Evas_Object *scroller; - int height = 0; - int width = 0; - - if (!data->widget_layout) { - return; - } - - scroller = elm_object_part_content_get(data->widget_layout, "scroller"); - if (!scroller) { - return; - } - - if (s_info.conf.field.is_scroll_x) { - height = data->widget_height >> 1; - } - - if (s_info.conf.field.is_scroll_y) { - width = data->widget_width >> 1; - } - - elm_scroller_region_show(scroller, width, height, data->widget_width, data->widget_height); -} - -static int invoke_raw_event_callback(enum widget_evas_raw_event_type type, const char *pkgname, Evas_Object *widget, int error) -{ - struct widget_evas_raw_event_info info; - struct raw_event_cbdata *cbdata; - Eina_List *l; - Eina_List *n; - int cnt = 0; - - info.pkgname = pkgname; - info.widget = widget; - info.error = error; - info.type = type; - - switch (type) { - case WIDGET_VIEWER_EVAS_RAW_DELETE: - EINA_LIST_FOREACH_SAFE(s_info.raw_event.delete_list, l, n, cbdata) { - if (cbdata->cb) { - cbdata->cb(&info, cbdata->data); - cnt++; - } - } - break; - case WIDGET_VIEWER_EVAS_RAW_CREATE: - EINA_LIST_FOREACH_SAFE(s_info.raw_event.create_list, l, n, cbdata) { - if (cbdata->cb) { - cbdata->cb(&info, cbdata->data); - cnt++; - } - } - break; - default: - break; - } - - return cnt; -} - -static widget_size_type_e find_size_type(struct widget_data *data, int w, int h) -{ - int cnt = WIDGET_COUNT_OF_SIZE_TYPE; - int i; - int *_w = NULL; - int *_h = NULL; - widget_size_type_e type = WIDGET_SIZE_TYPE_UNKNOWN; - int find; - int ret_type = WIDGET_SIZE_TYPE_UNKNOWN; - int delta; - - if (widget_service_get_supported_sizes(data->widget_id, &cnt, &_w, &_h) < 0) { - ErrPrint("No available sizes: %s\n", data->widget_id); - return WIDGET_SIZE_TYPE_UNKNOWN; - } - - find = 0x7FFFFFFF; - for (i = 0; i < cnt; i++) { - widget_service_get_size_type(_w[i], _h[i], &type); - - if (!s_info.conf.field.easy_mode) { - switch (type) { - case WIDGET_SIZE_TYPE_EASY_1x1: - case WIDGET_SIZE_TYPE_EASY_3x1: - case WIDGET_SIZE_TYPE_EASY_3x3: - continue; - default: - break; - } - } else { - switch (type) { - case WIDGET_SIZE_TYPE_EASY_1x1: - case WIDGET_SIZE_TYPE_EASY_3x1: - case WIDGET_SIZE_TYPE_EASY_3x3: - break; - default: - continue; - } - } - - delta = abs(_w[i] - w) + abs(_h[i] - h); - if (delta < find) { - find = delta; - ret_type = type; - } - } - - free(_w); - free(_h); - - return ret_type; -} - -static Eina_Bool effect_animator_cb(void *_data) -{ - struct animation_data *data = _data; - int w; - int h; - int x; - int y; - int move_x = 0; - int move_y = 0; - - evas_object_geometry_get(data->obj, &x, &y, &w, &h); - if (data->w == w && data->h == h) { - evas_object_event_callback_del(data->obj, EVAS_CALLBACK_DEL, animator_del_cb); - evas_object_data_del(data->obj, "animation"); - free(data); - return ECORE_CALLBACK_CANCEL; - } - - if (data->effect_mask & EFFECT_WIDTH) { - if (w < data->w) { - if (data->w - w > RESEVED_AREA_FOR_GBAR_EFFECT) { - w += 20; - move_x = 20; - } else if (data->w - w > 10) { - w += 8; - move_x = 8; - } else { - w++; - move_x = 1; - } - } else if (w > data->w) { - if (w - data->w > RESEVED_AREA_FOR_GBAR_EFFECT) { - w -= 20; - move_x = -20; - } else if (w - data->w > 10) { - w -= 8; - move_x = -8; - } else { - w--; - move_x = -1; - } - } - } else { - w = data->w; - } - - if (data->effect_mask & EFFECT_HEIGHT) { - if (h < data->h) { - if (data->h - h > RESEVED_AREA_FOR_GBAR_EFFECT) { - h += 20; - move_y = 20; - } else if (data->h - h > 10) { - h += 8; - move_y = 8; - } else { - h++; - move_y = 1; - } - } else if (h > data->h) { - if (h - data->h > RESEVED_AREA_FOR_GBAR_EFFECT) { - h -= 20; - move_y = -20; - } else if (h - data->h > 10) { - h -= 8; - move_y = -8; - } else { - h--; - move_y = -1; - } - } - } else { - h = data->h; - } - - if (data->effect_mask & EFFECT_MOVE) { - if (move_x) { - x -= move_x; - } - if (move_y) { - y -= move_y; - } - evas_object_move(data->obj, x, y); - } - - evas_object_resize(data->obj, w, h); - return ECORE_CALLBACK_RENEW; -} - -static void animator_del_cb(void *cbdata, Evas *e, Evas_Object *obj, void *event_info) -{ - struct animation_data *data; - - data = evas_object_data_del(obj, "animation"); - if (data) { - ecore_timer_del(data->timer); - free(data); - } -} - -static void effect_size_get(Evas_Object *obj, int *w, int *h) -{ - struct animation_data *data; - - data = evas_object_data_get(obj, "animation"); - if (data) { - *w = data->w; - *h = data->h; - } else { - evas_object_geometry_get(obj, NULL, NULL, w, h); - } -} - -static void effect_resize(Evas_Object *obj, int w, int h, unsigned int effect_mask) -{ - struct animation_data *data; - int ow; - int oh; - int ox; - int oy; - - evas_object_geometry_get(obj, &ox, &oy, &ow, &oh); - - data = evas_object_data_get(obj, "animation"); - if (data) { - if (ow == w && oh == h) { - evas_object_event_callback_del(obj, EVAS_CALLBACK_DEL, animator_del_cb); - evas_object_data_del(obj, "animation"); - free(data); - return; - } - /*! - * \note - * Update to new size - */ - data->w = w; - data->h = h; - return; - } else if (ow == w && oh == h) { - return; - } - - data = malloc(sizeof(*data)); - if (!data) { - ErrPrint("Heap: %d\n", errno); - return; - } - - data->obj = obj; - data->w = w; - data->h = h; - data->x = ox; - data->y = oy; - data->effect_mask = effect_mask; - - data->timer = ecore_timer_add(1.0f/60.0f, effect_animator_cb, data); - if (!data->timer) { - free(data); - return; - } - - evas_object_data_set(obj, "animation", data); - evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, animator_del_cb, data); -} - -struct widget_data *widget_ref(struct widget_data *data) -{ - data->refcnt++; - return data; -} - -static void dump_handle_list(void) -{ - Eina_List *l = NULL; - Eina_List *n; - Evas_Object *widget; - struct widget_data *data; - - DbgPrint("============== DUMP ==============="); - EINA_LIST_FOREACH_SAFE(s_info.list, l, n, widget) { - data = evas_object_smart_data_get(widget); - if (!data) { - continue; - } - - DbgPrint("data[%p] %s (%s)\n", data, data->widget_id, data->is.field.faulted ? "faulted" : "loaded"); - } - DbgPrint("==================================="); -} - -struct widget_data *widget_unref(struct widget_data *data) -{ - Eina_List *l; - Eina_List *n; - struct preview_info *info; - - data->refcnt--; - DbgPrint("refcnt: %d (%s)\n", data->refcnt, data->widget_id); - if (data->refcnt != 0) { - return data; - } - - DbgPrint("Destroy widget data %p(%s)\n", data, data->widget_id); - free(data->content); - free(data->widget_id); - free(data->cluster); - free(data->category); - - EINA_LIST_FOREACH_SAFE(data->preview_list, l, n, info) { - free(info->preview); - free(info); - } - - if (data->overlay_timer) { - ecore_timer_del(data->overlay_timer); - data->overlay_timer = NULL; - } - - if (data->widget_layout) { - Evas_Object *content; - - content = elm_object_part_content_unset(data->widget_layout, "widget,content"); - if (content) { - Evas_Object *front; - - front = elm_object_part_content_unset(content, "front,content"); - if (front) { - DbgPrint("Front image object is deleted\n"); - evas_object_del(front); - } - - DbgPrint("Content object deleted\n"); - evas_object_del(content); - } - - content = elm_object_part_content_unset(data->widget_layout, "overlay,content"); - if (content) { - DbgPrint("Overlay is deleted\n"); - evas_object_del(content); - } - - - DbgPrint("Remove WIDGET Layout\n"); - evas_object_del(data->widget_layout); - } else { - DbgPrint("Layout is already deleted\n"); - } - - if (data->gbar_layout) { - Evas_Object *content; - content = elm_object_part_content_get(data->gbar_layout, "gbar,content"); - if (content) { - Evas_Object *overlay; - overlay = elm_object_part_content_unset(content, "overlay,content"); - if (overlay) { - DbgPrint("Overlay is deleted\n"); - evas_object_del(overlay); - } - } - DbgPrint("Remove GBAR Layout\n"); - evas_object_del(data->gbar_layout); - } else { - DbgPrint("GBar layout is already deleted\n"); - } - - if (data->stage) { - DbgPrint("Remove Stage\n"); - evas_object_del(data->stage); - } else { - DbgPrint("Stage is already deleted\n"); - } - - if (data->widget_fb) { - widget_viewer_release_buffer(data->widget_fb); - data->widget_fb = NULL; - } - - if (data->gbar_fb) { - widget_viewer_release_buffer(data->gbar_fb); - data->gbar_fb = NULL; - } - - data->state = WIDGET_DATA_DELETED; - free(data); - dump_handle_list(); - return NULL; -} - -static void gbar_multi_down_cb(void *cbdata, Evas *e, Evas_Object *obj, void *event_info) -{ - Evas_Event_Multi_Down *down = event_info; - struct widget_data *data = cbdata; - struct widget_mouse_event_info minfo; - Evas_Coord x, y, w, h; - - if (data->state != WIDGET_DATA_CREATED) { - ErrPrint("Invalid widget data: %p\n", data); - return; - } - - SET_PRESSED(data, down->device); - - evas_object_geometry_get(obj, &x, &y, &w, &h); - - if (data->size_type != WIDGET_SIZE_TYPE_UNKNOWN && !s_info.conf.field.use_fixed_size) { - minfo.ratio_w = (double)data->fixed_width / (double)w; - minfo.ratio_h = (double)data->fixed_height / (double)h; - } else { - minfo.ratio_w = 1.0f; - minfo.ratio_h = 1.0f; - } - minfo.device = down->device; - - if (s_info.conf.field.auto_feed) { - minfo.x = (double)x; - minfo.y = (double)y; - widget_viewer_feed_mouse_event(data->handle, WIDGET_GBAR_MOUSE_SET, &minfo); - } else { - minfo.x = (double)(down->canvas.x - x); - minfo.y = (double)(down->canvas.y - y); - - widget_viewer_feed_mouse_event(data->handle, WIDGET_GBAR_MOUSE_ENTER, &minfo); - widget_viewer_feed_mouse_event(data->handle, WIDGET_GBAR_MOUSE_DOWN, &minfo); - } - - if (data->is.field.cancel_click == CANCEL_USER) { - minfo.x = (double)(down->canvas.x - x); - minfo.y = (double)(down->canvas.y - y); - - minfo.device = 0; - widget_viewer_feed_mouse_event(data->handle, WIDGET_GBAR_MOUSE_ON_HOLD, &minfo); - data->is.field.cancel_click = CANCEL_PROCESSED; - } -} - -static void gbar_down_cb(void *cbdata, Evas *e, Evas_Object *obj, void *event_info) -{ - Evas_Event_Mouse_Down *down = event_info; - struct widget_data *data = cbdata; - struct widget_mouse_event_info minfo; - Evas_Coord x, y, w, h; - - if (data->state != WIDGET_DATA_CREATED) { - ErrPrint("Invalid widget data: %p\n", data); - return; - } - - evas_object_geometry_get(obj, &data->down.geo.x, &data->down.geo.y, &w, &h); - x = data->down.geo.x; - y = data->down.geo.y; - data->down.is_gbar = 1; - - data->x[0] = data->down.x = down->canvas.x; - data->y[0] = data->down.y = down->canvas.y; - SET_PRESSED(data, 0); - if (s_info.conf.field.auto_render_selector) { - DbgPrint("Change to direct render\n"); - s_info.conf.field.render_animator = 0; - } - - /** - * In case of the GBar, - * There is no pre-defined size set. - * Every time its size will be notified to the provider app. - * So we don't need to handling the scale info of it. - */ - minfo.ratio_w = 1.0f; - minfo.ratio_h = 1.0f; - minfo.device = 0; - - if (s_info.conf.field.auto_feed) { - minfo.x = (double)x; - minfo.y = (double)y; - widget_viewer_feed_mouse_event(data->handle, WIDGET_GBAR_MOUSE_SET, &minfo); - } else { - minfo.x = (double)(down->canvas.x - x); - minfo.y = (double)(down->canvas.y - y); - widget_viewer_feed_mouse_event(data->handle, WIDGET_GBAR_MOUSE_ENTER, &minfo); - widget_viewer_feed_mouse_event(data->handle, WIDGET_GBAR_MOUSE_DOWN, &minfo); - } -} - -static void gbar_multi_move_cb(void *cbdata, Evas *e, Evas_Object *obj, void *event_info) +EAPI int widget_viewer_evas_init(Evas_Object *win) { - Evas_Event_Multi_Move *move = event_info; - struct widget_data *data = cbdata; - Evas_Coord x, y, w, h; - - if (data->state != WIDGET_DATA_CREATED) { - ErrPrint("Invalid widget data: %p\n", data); - return; - } - - if (!IS_PRESSED(data, move->device)) { - return; - } - - evas_object_geometry_get(obj, &x, &y, &w, &h); - - /** - * @note - * In this case, the ON_HOLD event is already sent. - * We don't need to check the cancel_state. - */ - if (!s_info.conf.field.auto_feed) { - struct widget_mouse_event_info minfo; - - minfo.x = (double)(move->cur.canvas.x - x); - minfo.y = (double)(move->cur.canvas.y - y); - - minfo.ratio_w = 1.0f; - minfo.ratio_h = 1.0f; - minfo.device = move->device; - - widget_viewer_feed_mouse_event(data->handle, WIDGET_GBAR_MOUSE_MOVE, &minfo); - - if (s_info.conf.field.auto_render_selector) { - DbgPrint("Change to direct render\n"); - s_info.conf.field.render_animator = 0; - } - } + return WIDGET_ERROR_NOT_SUPPORTED; } -static void gbar_move_cb(void *cbdata, Evas *e, Evas_Object *obj, void *event_info) +EAPI int widget_viewer_evas_fini(void) { - Evas_Event_Mouse_Move *move = event_info; - struct widget_data *data = cbdata; - Evas_Coord x, y, w, h; - - if (data->state != WIDGET_DATA_CREATED) { - ErrPrint("Invalid widget data: %p\n", data); - return; - } - - if (!IS_PRESSED(data,0)) { - return; - } - - evas_object_geometry_get(obj, &x, &y, &w, &h); - - data->x[0] = move->cur.canvas.x; - data->y[0] = move->cur.canvas.y; - - if (data->is.field.cancel_click == CANCEL_USER || !s_info.conf.field.auto_feed) { - struct widget_mouse_event_info minfo; - - minfo.x = (double)(move->cur.canvas.x - x); - minfo.y = (double)(move->cur.canvas.y - y); - - minfo.ratio_w = 1.0f; - minfo.ratio_h = 1.0f; - minfo.device = 0; - - if (!s_info.conf.field.auto_feed) { - widget_viewer_feed_mouse_event(data->handle, WIDGET_GBAR_MOUSE_MOVE, &minfo); - } - - if (data->is.field.cancel_click == CANCEL_USER) { - widget_viewer_feed_mouse_event(data->handle, WIDGET_GBAR_MOUSE_ON_HOLD, &minfo); - data->is.field.cancel_click = CANCEL_PROCESSED; - } - - if (s_info.conf.field.auto_render_selector) { - DbgPrint("Change to direct render\n"); - s_info.conf.field.render_animator = 0; - } - } + return WIDGET_ERROR_NOT_SUPPORTED; } -static void __widget_pixmap_del_cb(void *cbdata, Evas *e, Evas_Object *obj, void *event_info) +EAPI int widget_viewer_evas_notify_resumed_status_of_viewer(void) { - struct widget_data *data = cbdata; - - if (data->widget_pixmap) { - if (!s_info.conf.field.skip_acquire) { - widget_viewer_release_resource_id(data->handle, 0, data->widget_pixmap); - } - data->widget_pixmap = 0; - } - - if (data->widget_extra) { - int idx; - - for (idx = 0; idx < widget_viewer_get_option(WIDGET_OPTION_EXTRA_BUFFER_CNT); idx++) { - if (data->widget_extra[idx] != 0u) { - if (!s_info.conf.field.skip_acquire) { - if (widget_viewer_release_resource_id(data->handle, 0, data->widget_extra[idx]) < 0) { - ErrPrint("Failed to release %u\n", data->widget_extra[idx]); - } - } - data->widget_extra[idx] = 0u; - } - } - - free(data->widget_extra); - data->widget_extra = NULL; - } + return WIDGET_ERROR_NOT_SUPPORTED; } -static void gbar_pixmap_del_cb(void *cbdata, Evas *e, Evas_Object *obj, void *event_info) +EAPI int widget_viewer_evas_notify_paused_status_of_viewer(void) { - struct widget_data *data = cbdata; - - if (data->gbar_pixmap) { - if (!s_info.conf.field.skip_acquire) { - widget_viewer_release_resource_id(data->handle, 1, data->gbar_pixmap); - } - data->gbar_pixmap = 0; - } - - if (data->gbar_extra) { - int idx; - - for (idx = 0; idx < widget_viewer_get_option(WIDGET_OPTION_EXTRA_BUFFER_CNT); idx++) { - if (data->gbar_extra[idx] != 0u) { - if (!s_info.conf.field.skip_acquire) { - if (widget_viewer_release_resource_id(data->handle, 0, data->gbar_extra[idx]) < 0) { - ErrPrint("Failed to release %u\n", data->gbar_extra[idx]); - } - } - data->gbar_extra[idx] = 0u; - } - } - - free(data->gbar_extra); - data->gbar_extra = NULL; - } + return WIDGET_ERROR_NOT_SUPPORTED; } -static void gbar_multi_up_cb(void *cbdata, Evas *e, Evas_Object *obj, void *event_info) +EAPI int widget_viewer_evas_notify_orientation_of_viewer(int orientation) { - Evas_Event_Multi_Up *up = event_info; - struct widget_data *data = cbdata; - Evas_Coord x, y, w, h; - struct widget_mouse_event_info minfo; - - if (data->state != WIDGET_DATA_CREATED) { - ErrPrint("Invalid widget data: %p\n", data); - return; - } - - if (!IS_PRESSED(data, up->device)) { - return; - } - - SET_RELEASED(data, up->device); - - evas_object_geometry_get(obj, &x, &y, &w, &h); - - minfo.ratio_w = 1.0f; - minfo.ratio_h = 1.0f; - minfo.device = up->device; - - if (s_info.conf.field.auto_feed) { - /** - * @note - * UNSET will subtract object.x and object.y by master - * so we just send original touch position based on screen - */ - minfo.x = (double)up->canvas.x; - minfo.y = (double)up->canvas.y; - - widget_viewer_feed_mouse_event(data->handle, WIDGET_GBAR_MOUSE_UNSET, &minfo); - } else { - minfo.x = (double)(up->canvas.x - x); - minfo.y = (double)(up->canvas.y - y); - - widget_viewer_feed_mouse_event(data->handle, WIDGET_GBAR_MOUSE_UP, &minfo); - widget_viewer_feed_mouse_event(data->handle, WIDGET_GBAR_MOUSE_LEAVE, &minfo); - } -} - -static void gbar_up_cb(void *cbdata, Evas *e, Evas_Object *obj, void *event_info) -{ - Evas_Event_Mouse_Up *up = event_info; - struct widget_data *data = cbdata; - Evas_Coord x, y, w, h; - struct widget_mouse_event_info minfo; - - if (data->state != WIDGET_DATA_CREATED) { - ErrPrint("Invalid widget data: %p\n", data); - return; - } - - if (!IS_PRESSED(data, 0)) { - return; - } - - SET_RELEASED(data, 0); - - evas_object_geometry_get(obj, &x, &y, &w, &h); - - minfo.ratio_w = 1.0f; - minfo.ratio_h = 1.0f; - minfo.device = 0; - - /** - * @note - * If the object is moved, we should send ON_HOLD event. - */ - if (data->down.geo.x != x || data->down.geo.y != y || data->is.field.cancel_click == CANCEL_USER) { - if (data->is.field.cancel_click != CANCEL_PROCESSED) { - minfo.x = (double)(up->canvas.x - x); - minfo.y = (double)(up->canvas.y - y); - widget_viewer_feed_mouse_event(data->handle, WIDGET_GBAR_MOUSE_ON_HOLD, &minfo); - data->is.field.cancel_click = CANCEL_PROCESSED; - } - } - - if (s_info.conf.field.auto_feed) { - /** - * @note - * UNSET will subtract object.x and object.y by master - * so we just send original touch position based on screen - */ - minfo.x = (double)up->canvas.x; - minfo.y = (double)up->canvas.y; - - widget_viewer_feed_mouse_event(data->handle, WIDGET_GBAR_MOUSE_UNSET, &minfo); - } else { - minfo.x = (double)(up->canvas.x - x); - minfo.y = (double)(up->canvas.y - y); - - widget_viewer_feed_mouse_event(data->handle, WIDGET_GBAR_MOUSE_UP, &minfo); - widget_viewer_feed_mouse_event(data->handle, WIDGET_GBAR_MOUSE_LEAVE, &minfo); - } - - data->is.field.cancel_click = CANCEL_DISABLED; -} - -static void smart_callback_call(struct widget_data *data, const char *signal, void *cbdata) -{ - if (data->is.field.deleted || !data->widget) { - DbgPrint("widget is deleted, ignore smart callback call\n"); - return; - } - - evas_object_smart_callback_call(data->widget, signal, cbdata); -} - -static void __widget_multi_down_cb(void *cbdata, Evas *e, Evas_Object *obj, void *event_info) -{ - Evas_Event_Multi_Down *down = event_info; - struct widget_data *data = cbdata; - Evas_Coord x, y, w, h; - - if (data->state != WIDGET_DATA_CREATED) { - ErrPrint("Invalid widget data: %p\n", data); - return; - } - - data->x[down->device] = down->canvas.x; - data->y[down->device] = down->canvas.y; - - evas_object_geometry_get(obj, &x, &y, &w, &h); - - /** - * @note - * If the multi-touch started, - * GBar will not be created. - */ - if (s_info.conf.field.support_gbar && data->is.field.flick_down) { - struct widget_evas_event_info info; - - DbgPrint("Flick down is canceled\n"); - data->is.field.flick_down = 0; - info.widget_app_id = data->widget_id; - info.event = WIDGET_EVENT_GBAR_CREATED; - info.error = WIDGET_ERROR_CANCELED; - - smart_callback_call(data, WIDGET_SMART_SIGNAL_FLICKDOWN_CANCELLED, &info); - } - - if (s_info.conf.field.auto_render_selector) { - DbgPrint("Change to direct render\n"); - s_info.conf.field.render_animator = 0; - } - - SET_PRESSED(data, down->device); - - if (data->handle && !data->is.field.faulted) { - struct widget_mouse_event_info minfo; - - if (!s_info.conf.field.use_fixed_size) { - minfo.ratio_w = (double)data->fixed_width / (double)w; - minfo.ratio_h = (double)data->fixed_height / (double)h; - } else { - minfo.ratio_w = 1.0f; - minfo.ratio_h = 1.0f; - } - minfo.device = down->device; - - if (s_info.conf.field.auto_feed && data->is.field.mouse_event) { - minfo.x = (double)data->down.geo.x; - minfo.y = (double)data->down.geo.y; - DbgPrint("[%d] %lfx%lf (%lfx%lf), %dx%d %dx%d\n", minfo.device, minfo.x, minfo.y, minfo.ratio_w, minfo.ratio_h, data->fixed_width, data->fixed_height, w, h); - widget_viewer_feed_mouse_event(data->handle, WIDGET_MOUSE_SET, &minfo); - } else { - minfo.x = (double)(data->x[down->device] - x); - minfo.y = (double)(data->y[down->device] - y); - - DbgPrint("[%d] %lfx%lf (%lfx%lf)\n", minfo.device, minfo.x, minfo.y, minfo.ratio_w, minfo.ratio_h); - - widget_viewer_feed_mouse_event(data->handle, WIDGET_MOUSE_ENTER, &minfo); - widget_viewer_feed_mouse_event(data->handle, WIDGET_MOUSE_DOWN, &minfo); - widget_viewer_feed_mouse_event(data->handle, WIDGET_MOUSE_MOVE, &minfo); - } - - /** - * @note - * Send the ON_HOLD event if the multi-touch events are triggered. - */ - if (data->is.field.cancel_click != CANCEL_PROCESSED) { - DbgPrint("ON_HOLD send\n"); - minfo.x = (double)(data->x[0] - x); - minfo.y = (double)(data->y[0] - y); - minfo.device = 0; - widget_viewer_feed_mouse_event(data->handle, WIDGET_MOUSE_ON_HOLD, &minfo); - data->is.field.cancel_click = CANCEL_PROCESSED; - } - } -} - -static void __widget_down_cb(void *cbdata, Evas *e, Evas_Object *obj, void *event_info) -{ - Evas_Event_Mouse_Down *down = event_info; - struct widget_data *data = cbdata; - Evas_Coord x, y, w, h; - - if (data->state != WIDGET_DATA_CREATED) { - ErrPrint("Invalid widget data: %p\n", data); - return; - } - - if (s_info.conf.field.support_gbar && !data->is.field.gbar_created) { - data->is.field.flick_down = 1; - } - - data->down.x = data->x[0] = down->canvas.x; - data->down.y = data->y[0] = down->canvas.y; - data->down.is_gbar = 0; - data->is.field.scroll_x = 0; - data->is.field.scroll_y = 0; - data->is.field.cancel_scroll_x = 0; - data->is.field.cancel_scroll_y = 0; - - if (s_info.conf.field.auto_render_selector) { - DbgPrint("Change to direct render\n"); - s_info.conf.field.render_animator = 0; - } - - evas_object_geometry_get(obj, &data->down.geo.x, &data->down.geo.y, &w, &h); - x = data->down.geo.x; - y = data->down.geo.y; - - if (s_info.conf.field.sensitive_move && (data->down.geo.x != data->view_port.x || data->down.geo.y != data->view_port.y)) { - SET_RELEASED(data, 0); - if (s_info.conf.field.auto_render_selector) { - DbgPrint("Change to render animator\n"); - s_info.conf.field.render_animator = 1; - } - return; - } - - SET_PRESSED(data, 0); - - if (data->handle && !data->is.field.faulted) { - struct widget_mouse_event_info minfo; - - if (!s_info.conf.field.use_fixed_size) { - minfo.ratio_w = (double)data->fixed_width / (double)w; - minfo.ratio_h = (double)data->fixed_height / (double)h; - } else { - minfo.ratio_w = 1.0f; - minfo.ratio_h = 1.0f; - } - minfo.device = 0; - - if (s_info.conf.field.auto_feed && data->is.field.mouse_event) { - minfo.x = (double)x; - minfo.y = (double)y; - DbgPrint("%lfx%lf (%lfx%lf), %dx%d %dx%d\n", minfo.x, minfo.y, minfo.ratio_w, minfo.ratio_h, data->fixed_width, data->fixed_height, w, h); - widget_viewer_feed_mouse_event(data->handle, WIDGET_MOUSE_SET, &minfo); - } else { - minfo.x = (double)(data->x[0] - x); - minfo.y = (double)(data->y[0] - y); - - DbgPrint("%lfx%lf (%lfx%lf)\n", minfo.x, minfo.y, minfo.ratio_w, minfo.ratio_h); - - widget_viewer_feed_mouse_event(data->handle, WIDGET_MOUSE_ENTER, &minfo); - widget_viewer_feed_mouse_event(data->handle, WIDGET_MOUSE_DOWN, &minfo); - widget_viewer_feed_mouse_event(data->handle, WIDGET_MOUSE_MOVE, &minfo); - } - } -} - -static void __widget_destroy_gbar_cb(struct widget *handle, int ret, void *cbdata) -{ - struct widget_data *data = cbdata; - Evas_Object *gbar_content; - struct widget_evas_event_info info; - - if (data->state != WIDGET_DATA_CREATED) { - ErrPrint("Invalid widget data: %p\n", data); - return; - } - - data->is.field.gbar_created = 0; - - info.error = ret; - info.event = WIDGET_EVENT_GBAR_DESTROYED; - info.widget_app_id = data->widget_id; - smart_callback_call(data, WIDGET_SMART_SIGNAL_GBAR_DESTROYED, &info); - - DbgPrint("ret: %d\n", ret); - gbar_content = elm_object_part_content_unset(data->gbar_layout, "gbar,content"); - if (gbar_content) { - Evas_Native_Surface *surface; - unsigned int pixmap; - widget_type_e widget_type; - - widget_viewer_get_type(data->handle, 1, &widget_type); - - switch (widget_type) { - case WIDGET_CONTENT_TYPE_RESOURCE_ID: - if (!s_info.conf.field.force_to_buffer) { - surface = evas_object_image_native_surface_get(gbar_content); - if (!surface) { - ErrPrint("surface is NULL\n"); - evas_object_del(gbar_content); - break; - } - - pixmap = util_get_resource_id_of_native_surface(surface); - evas_object_del(gbar_content); - - if (!s_info.conf.field.skip_acquire) { - widget_viewer_release_resource_id(data->handle, 1, (int)pixmap); - } - - if (pixmap == data->gbar_pixmap) { - data->gbar_pixmap = 0; - } - break; - } - case WIDGET_CONTENT_TYPE_BUFFER: - if (data->gbar_fb) { - widget_viewer_release_buffer(data->gbar_fb); - data->gbar_fb = NULL; - } - evas_object_del(gbar_content); - break; - case WIDGET_CONTENT_TYPE_TEXT: - break; - case WIDGET_CONTENT_TYPE_UIFW: - break; - case WIDGET_CONTENT_TYPE_INVALID: - default: - break; - } - } - - if (data->gbar_layout) { - evas_object_del(data->gbar_layout); - data->gbar_layout = NULL; - } - - remove_gbar_dirty_object_list(data); - widget_unref(data); -} - -static void gbar_animation_done_cb(void *cbdata, Evas_Object *obj, const char *signal_name, const char *source) -{ - Evas_Object *rect; - struct widget_data *data = cbdata; - - if (data->state != WIDGET_DATA_CREATED) { - ErrPrint("Invalid widget data: %p\n", data); - return; - } - - rect = elm_object_part_content_unset(obj, "overlay,content"); - if (rect) { - evas_object_del(rect); - } -} - -static void gbar_create_buffer_object(struct widget_data *data) -{ - Evas_Object *gbar_content; - - gbar_content = elm_object_part_content_get(data->gbar_layout, "gbar,content"); - if (!gbar_content) { - gbar_content = evas_object_image_filled_add(data->e); - if (!gbar_content) { - ErrPrint("Failed to create an image object\n"); - } else { - evas_object_image_colorspace_set(gbar_content, EVAS_COLORSPACE_ARGB8888); - evas_object_image_alpha_set(gbar_content, EINA_TRUE); - - elm_object_part_content_set(data->gbar_layout, "gbar,content", gbar_content); - } - } -} - -static int do_text_update_color(Evas_Object *layout, const char *part, const char *data) -{ - int ret; - int r[3], g[3], b[3], a[3]; - ret = sscanf(data, "%d %d %d %d %d %d %d %d %d %d %d %d", - r, g, b, a, /* OBJECT */ - r + 1, g + 1, b + 1, a + 1, /* OUTLINE */ - r + 2, g + 2, b + 2, a + 2); /* SHADOW */ - if (ret != 12) { - DbgPrint("part[%s] rgba[%s]\n", part, data); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - ret = edje_object_color_class_set(elm_layout_edje_get(layout), part, - r[0], g[0], b[0], a[0], /* OBJECT */ - r[1], g[1], b[1], a[1], /* OUTLINE */ - r[2], g[2], b[2], a[2]); /* SHADOW */ - - return WIDGET_ERROR_NONE; -} - -static void update_focus_chain(Evas_Object *parent, Evas_Object *ao) -{ - const Eina_List *list; - - list = elm_object_focus_custom_chain_get(parent); - if (!eina_list_data_find(list, ao)) { - DbgPrint("Append again to the focus chain\n"); - elm_object_focus_custom_chain_append(parent, ao, NULL); - } -} - -static void activate_cb(void *data, Evas_Object *part_obj, Elm_Object_Item *item) -{ - Evas *e; - int x; - int y; - int w; - int h; - double timestamp; - - e = evas_object_evas_get(part_obj); - evas_object_geometry_get(part_obj, &x, &y, &w, &h); - x += w / 2; - y += h / 2; - -#if defined(_USE_ECORE_TIME_GET) - timestamp = ecore_time_get(); -#else - struct timeval tv; - if (gettimeofday(&tv, NULL) < 0) { - ErrPrint("Failed to get time\n"); - timestamp = 0.0f; - } else { - timestamp = (double)tv.tv_sec + ((double)tv.tv_usec / 1000000.0f); - } -#endif - - DbgPrint("Cursor is on %dx%d\n", x, y); - evas_event_feed_mouse_move(e, x, y, timestamp * 1000, NULL); - evas_event_feed_mouse_down(e, 1, EVAS_BUTTON_NONE, (timestamp + 0.01f) * 1000, NULL); - evas_event_feed_mouse_move(e, x, y, (timestamp + 0.02f) * 1000, NULL); - evas_event_feed_mouse_up(e, 1, EVAS_BUTTON_NONE, (timestamp + 0.03f) * 1000, NULL); -} - -static int do_text_update_access(Evas_Object *parent, Evas_Object *layout, const char *part, const char *text, const char *option) -{ - Evas_Object *edje_part; - - elm_object_part_text_set(layout, part, text ? text : ""); - - edje_part = (Evas_Object *)edje_object_part_object_get(elm_layout_edje_get(layout), part); - if (edje_part) { - Evas_Object *ao; - char *utf8; - - ao = evas_object_data_get(edje_part, "ao"); - if (!ao) { - ao = elm_access_object_register(edje_part, parent); - if (!ao) { - ErrPrint("Unable to register an access object(%s)\n", part); - return WIDGET_ERROR_NONE; - } - - evas_object_data_set(edje_part, "ao", ao); - elm_access_activate_cb_set(ao, activate_cb, NULL); - elm_object_focus_custom_chain_append(parent, ao, NULL); - - DbgPrint("[%s] Register access info: (%s) to, %p\n", part, text, parent); - } - - if (!text || !strlen(text)) { - /*! - * \note - * Delete callback will be called - */ - DbgPrint("[%s] Remove access object(%p)\n", part, ao); - elm_access_object_unregister(ao); - - return WIDGET_ERROR_NONE; - } - - utf8 = elm_entry_markup_to_utf8(text); - if ((!utf8 || !strlen(utf8))) { - free(utf8); - /*! - * \note - * Delete callback will be called - */ - DbgPrint("[%s] Remove access object(%p)\n", part, ao); - elm_access_object_unregister(ao); - - return WIDGET_ERROR_NONE; - } - - elm_access_info_set(ao, ELM_ACCESS_INFO, utf8); - free(utf8); - - update_focus_chain(parent, ao); - } else { - ErrPrint("Unable to get text part[%s]\n", part); - } - - return WIDGET_ERROR_NONE; -} - -static void parse_aspect(struct image_option *img_opt, const char *value, int len) -{ - while (len > 0 && *value == ' ') { - value++; - len--; - } - - if (len < 4) { - return; - } - - img_opt->aspect = !strncasecmp(value, "true", 4); - DbgPrint("Parsed ASPECT: %d (%s)\n", img_opt->aspect, value); -} - -static void parse_orient(struct image_option *img_opt, const char *value, int len) -{ - while (len > 0 && *value == ' ') { - value++; - len--; - } - - if (len < 4) { - return; - } - - img_opt->orient = !strncasecmp(value, "true", 4); - DbgPrint("Parsed ORIENT: %d (%s)\n", img_opt->orient, value); -} - -static void parse_size(struct image_option *img_opt, const char *value, int len) -{ - int width; - int height; - char *buf; - - while (len > 0 && *value == ' ') { - value++; - len--; - } - - buf = strndup(value, len); - if (!buf) { - ErrPrint("Heap: %d\n", errno); - return; - } - - if (sscanf(buf, "%dx%d", &width, &height) == 2) { - img_opt->width = width; - img_opt->height = height; - DbgPrint("Parsed size : %dx%d (%s)\n", width, height, buf); - } else { - DbgPrint("Invalid size tag[%s]\n", buf); - } - - free(buf); -} - -static void parse_shadow(struct image_option *img_opt, const char *value, int len) -{ - int angle; - int offset; - int softness; - int color; - - if (sscanf(value, "%d,%d,%d,%x", &angle, &offset, &softness, &color) != 4) { - ErrPrint("Invalid shadow [%s]\n", value); - } else { - img_opt->shadow.enabled = 1; - img_opt->shadow.angle = angle; - img_opt->shadow.offset = offset; - img_opt->shadow.softness = softness; - img_opt->shadow.color = color; - } -} - -static void parse_fill(struct image_option *img_opt, const char *value, int len) -{ - while (len > 0 && *value == ' ') { - value++; - len--; - } - - if (!strncasecmp(value, "in-size", len)) { - img_opt->fill = FILL_IN_SIZE; - } else if (!strncasecmp(value, "over-size", len)) { - img_opt->fill = FILL_OVER_SIZE; - } else if (!strncasecmp(value, "fit-size", len)) { - img_opt->fill = FILL_FIT_SIZE; - } else { - img_opt->fill = FILL_DISABLE; - } - - DbgPrint("Parsed FILL: %d (%s)\n", img_opt->fill, value); -} - -static inline void parse_image_option(const char *option, struct image_option *img_opt) -{ - const char *ptr; - const char *cmd; - const char *value; - struct { - const char *cmd; - void (*handler)(struct image_option *img_opt, const char *value, int len); - } cmd_list[] = { - { - .cmd = "aspect", /* Keep the aspect ratio */ - .handler = parse_aspect, - }, - { - .cmd = "orient", /* Keep the orientation value: for the rotated images */ - .handler = parse_orient, - }, - { - .cmd = "fill", /* Fill the image to its container */ - .handler = parse_fill, /* Value: in-size, over-size, disable(default) */ - }, - { - .cmd = "size", - .handler = parse_size, - }, - { - .cmd = "shadow", - .handler = parse_shadow, - }, - }; - enum { - STATE_START, - STATE_TOKEN, - STATE_DATA, - STATE_IGNORE, - STATE_ERROR, - STATE_END - } state; - int idx; - int tag; - - if (!option || !*option) { - return; - } - - state = STATE_START; - /*! - * \note - * GCC 4.7 warnings uninitialized idx and tag value. - * But it will be initialized by the state machine. :( - * Anyway, I just reset idx and tag for reducing the GCC4.7 complains. - */ - idx = 0; - tag = 0; - cmd = NULL; - value = NULL; - - for (ptr = option; state != STATE_END; ptr++) { - switch (state) { - case STATE_START: - if (*ptr == '\0') { - state = STATE_END; - continue; - } - - if (isalpha(*ptr)) { - state = STATE_TOKEN; - ptr--; - } - tag = 0; - idx = 0; - - cmd = cmd_list[tag].cmd; - break; - case STATE_IGNORE: - if (*ptr == '=') { - state = STATE_DATA; - value = ptr; - } else if (*ptr == '\0') { - state = STATE_END; - } - break; - case STATE_TOKEN: - if (cmd[idx] == '\0' && (*ptr == ' ' || *ptr == '\t' || *ptr == '=')) { - if (*ptr == '=') { - value = ptr; - state = STATE_DATA; - } else { - state = STATE_IGNORE; - } - idx = 0; - } else if (*ptr == '\0') { - state = STATE_END; - } else if (cmd[idx] == *ptr) { - idx++; - } else { - ptr -= (idx + 1); - - tag++; - if (tag == sizeof(cmd_list) / sizeof(cmd_list[0])) { - tag = 0; - state = STATE_ERROR; - } else { - cmd = cmd_list[tag].cmd; - } - idx = 0; - } - break; - case STATE_DATA: - if (*ptr == ';' || *ptr == '\0') { - cmd_list[tag].handler(img_opt, value + 1, idx); - state = *ptr ? STATE_START : STATE_END; - } else { - idx++; - } - break; - case STATE_ERROR: - if (*ptr == ';') { - state = STATE_START; - } else if (*ptr == '\0') { - state = STATE_END; - } - break; - default: - break; - } - } -} - -static inline void apply_shadow_effect(struct image_option *img_opt, Evas_Object *img) -{ -#if defined(SUPPORT_IMAGE_EFFECT) - ea_effect_h *ea_effect; - - if (!img_opt->shadow.enabled) { - return; - } - - ea_effect = ea_image_effect_create(); - if (!ea_effect) { - return; - } - - /* -90, 2, 4, 0x99000000 */ - ea_image_effect_add_outer_shadow(ea_effect, img_opt->shadow.angle, img_opt->shadow.offset, img_opt->shadow.softness, img_opt->shadow.color); - ea_object_image_effect_set(img, ea_effect); - - ea_image_effect_destroy(ea_effect); -#endif -} - -static Evas_Object *crop_image(Evas_Object *img, const char *path, int part_w, int part_h, int w, int h, struct image_option *img_opt) -{ - Ecore_Evas *ee; - Evas *e; - Evas_Object *src_img; - Evas_Coord rw, rh; - const void *data; - Evas_Load_Error err; - Evas_Object *_img; - - ee = ecore_evas_buffer_new(part_w, part_h); - if (!ee) { - ErrPrint("Failed to create a EE\n"); - return img; - } - - ecore_evas_alpha_set(ee, EINA_TRUE); - - e = ecore_evas_get(ee); - if (!e) { - ErrPrint("Unable to get Evas\n"); - ecore_evas_free(ee); - return img; - } - - src_img = evas_object_image_filled_add(e); - if (!src_img) { - ErrPrint("Unable to add an image\n"); - ecore_evas_free(ee); - return img; - } - - evas_object_image_alpha_set(src_img, EINA_TRUE); - evas_object_image_colorspace_set(src_img, EVAS_COLORSPACE_ARGB8888); - evas_object_image_smooth_scale_set(src_img, EINA_TRUE); - evas_object_image_load_orientation_set(src_img, img_opt->orient); - evas_object_image_file_set(src_img, path, NULL); - err = evas_object_image_load_error_get(src_img); - if (err != EVAS_LOAD_ERROR_NONE) { - ErrPrint("Load error: %s\n", evas_load_error_str(err)); - evas_object_del(src_img); - ecore_evas_free(ee); - return img; - } - evas_object_image_size_get(src_img, &rw, &rh); - evas_object_image_fill_set(src_img, 0, 0, rw, rh); - evas_object_resize(src_img, w, h); - evas_object_move(src_img, -(w - part_w) / 2, -(h - part_h) / 2); - evas_object_show(src_img); - - data = ecore_evas_buffer_pixels_get(ee); - if (!data) { - ErrPrint("Unable to get pixels\n"); - evas_object_del(src_img); - ecore_evas_free(ee); - return img; - } - - e = evas_object_evas_get(img); - _img = evas_object_image_filled_add(e); - if (!_img) { - evas_object_del(src_img); - ecore_evas_free(ee); - return img; - } - - evas_object_image_colorspace_set(_img, EVAS_COLORSPACE_ARGB8888); - evas_object_image_smooth_scale_set(_img, EINA_TRUE); - evas_object_image_alpha_set(_img, EINA_TRUE); - evas_object_image_data_set(_img, NULL); - evas_object_image_size_set(_img, part_w, part_h); - evas_object_resize(_img, part_w, part_h); - evas_object_image_data_copy_set(_img, (void *)data); - evas_object_image_fill_set(_img, 0, 0, part_w, part_h); - evas_object_image_data_update_add(_img, 0, 0, part_w, part_h); - - evas_object_del(src_img); - ecore_evas_free(ee); - - evas_object_del(img); - return _img; -} - -static int do_text_update_text(Evas_Object *parent, Evas_Object *layout, const char *part, const char *text) -{ - Evas_Object *edje_part; - - DbgPrint("Part[%s], Text[%s]\n", part, text); - elm_object_part_text_set(layout, part, text ? text : ""); - - edje_part = (Evas_Object *)edje_object_part_object_get(elm_layout_edje_get(layout), part); - if (edje_part) { - Evas_Object *ao; - char *utf8; - - ao = evas_object_data_get(edje_part, "ao"); - if (!ao) { - ao = elm_access_object_register(edje_part, parent); - if (!ao) { - ErrPrint("Unable to register an access object(%s)\n", part); - return WIDGET_ERROR_NONE; - } - - evas_object_data_set(edje_part, "ao", ao); - elm_access_activate_cb_set(ao, activate_cb, NULL); - elm_object_focus_custom_chain_append(parent, ao, NULL); - - DbgPrint("[%s] Register access info: (%s) to, %p\n", part, text, parent); - } - - if (!text || !strlen(text)) { - /*! - * \note - * Delete callback will be called - */ - DbgPrint("[%s] Remove access object(%p)\n", part, ao); - elm_access_object_unregister(ao); - - return WIDGET_ERROR_NONE; - } - - utf8 = elm_entry_markup_to_utf8(text); - if ((!utf8 || !strlen(utf8))) { - free(utf8); - /*! - * \note - * Delete callback will be called - */ - DbgPrint("[%s] Remove access object(%p)\n", part, ao); - elm_access_object_unregister(ao); - - return WIDGET_ERROR_NONE; - } - - elm_access_info_set(ao, ELM_ACCESS_INFO, utf8); - free(utf8); - - update_focus_chain(parent, ao); - } else { - ErrPrint("Unable to get text part[%s]\n", part); - } - - return WIDGET_ERROR_NONE; -} - -static int do_text_update_image(Evas_Object *layout, const char *part, const char *data, const char *option) -{ - Evas_Object *content; - Evas_Load_Error err; - Evas_Coord w; - Evas_Coord h; - struct image_option img_opt = { - .aspect = 0, - .orient = 0, - .fill = FILL_DISABLE, - .width = -1, - .height = -1, - .shadow = { - .enabled = 0, - }, - }; - - content = elm_object_part_content_unset(layout, part); - if (content) { - evas_object_del(content); - } - - if (!data || !strlen(data) || access(data, R_OK) != 0) { - ErrPrint("Skip image: %s, deleted\n", part); - return WIDGET_ERROR_NONE; - } - - content = evas_object_image_add(evas_object_evas_get(layout)); - if (!content) { - ErrPrint("Failed to add an image object\n"); - return WIDGET_ERROR_FAULT; - } - - evas_object_image_preload(content, EINA_FALSE); - parse_image_option(option, &img_opt); - evas_object_image_load_orientation_set(content, img_opt.orient); - - evas_object_image_file_set(content, data, NULL); - err = evas_object_image_load_error_get(content); - if (err != EVAS_LOAD_ERROR_NONE) { - ErrPrint("Load error: %s\n", evas_load_error_str(err)); - evas_object_del(content); - return WIDGET_ERROR_IO_ERROR; - } - - apply_shadow_effect(&img_opt, content); - - evas_object_image_size_get(content, &w, &h); - if (img_opt.aspect) { - if (img_opt.fill == FILL_OVER_SIZE) { - Evas_Coord part_w; - Evas_Coord part_h; - - if (img_opt.width >= 0 && img_opt.height >= 0) { - part_w = img_opt.width; - part_h = img_opt.height; - } else { - part_w = 0; - part_h = 0; - edje_object_part_geometry_get(elm_layout_edje_get(layout), part, NULL, NULL, &part_w, &part_h); - } - DbgPrint("Original %dx%d (part: %dx%d)\n", w, h, part_w, part_h); - - if (part_w > w || part_h > h) { - double fw; - double fh; - - fw = (double)part_w / (double)w; - fh = (double)part_h / (double)h; - - if (fw > fh) { - w = part_w; - h = (double)h * fw; - } else { - h = part_h; - w = (double)w * fh; - } - } - - if (!part_w || !part_h || !w || !h) { - evas_object_del(content); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - content = crop_image(content, data, part_w, part_h, w, h, &img_opt); - } else if (img_opt.fill == FILL_IN_SIZE) { - Evas_Coord part_w; - Evas_Coord part_h; - - if (img_opt.width >= 0 && img_opt.height >= 0) { - part_w = img_opt.width * elm_config_scale_get(); - part_h = img_opt.height * elm_config_scale_get(); - } else { - part_w = 0; - part_h = 0; - edje_object_part_geometry_get(elm_layout_edje_get(layout), part, NULL, NULL, &part_w, &part_h); - } - DbgPrint("Original %dx%d (part: %dx%d)\n", w, h, part_w, part_h); - - if (w > part_w || h > part_h) { - double fw; - double fh; - - fw = (double)part_w / (double)w; - fh = (double)part_h / (double)h; - - if (fw > fh) { - h = part_h; - w = (double)w * fh; - } else { - w = part_w; - h = (double)h * fw; - } - } - - if (!part_w || !part_h || !w || !h) { - evas_object_del(content); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - content = crop_image(content, data, part_w, part_h, w, h, &img_opt); - } else if (img_opt.fill == FILL_FIT_SIZE) { - Evas_Coord part_w; - Evas_Coord part_h; - double fw; - double fh; - - if (img_opt.width >= 0 && img_opt.height >= 0) { - part_w = img_opt.width * elm_config_scale_get(); - part_h = img_opt.height * elm_config_scale_get(); - } else { - part_w = 0; - part_h = 0; - edje_object_part_geometry_get(elm_layout_edje_get(layout), part, NULL, NULL, &part_w, &part_h); - } - DbgPrint("Original %dx%d (part: %dx%d)\n", w, h, part_w, part_h); - - fw = (double)part_w / (double)w; - fh = (double)part_h / (double)h; - - if (fw < fh) { - h = part_h; - w = (double)w * fh; - } else { - w = part_w; - h = (double)h * fw; - } - - if (!part_w || !part_h || !w || !h) { - evas_object_del(content); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - content = crop_image(content, data, part_w, part_h, w, h, &img_opt); - } else { - evas_object_image_fill_set(content, 0, 0, w, h); - evas_object_size_hint_fill_set(content, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_size_hint_aspect_set(content, EVAS_ASPECT_CONTROL_BOTH, w, h); - } - - apply_shadow_effect(&img_opt, content); - } else { - if (img_opt.width >= 0 && img_opt.height >= 0) { - w = img_opt.width; - h = img_opt.height; - DbgPrint("Using given image size: %dx%d\n", w, h); - } - - evas_object_image_fill_set(content, 0, 0, w, h); - evas_object_size_hint_fill_set(content, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_size_hint_weight_set(content, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_image_filled_set(content, EINA_TRUE); - } - - - /*! - * \note - * object will be shown by below statement automatically - */ - DbgPrint("%s part swallow image %p (%dx%d)\n", part, content, w, h); - elm_object_part_content_set(layout, part, content); - - /*! - * \note - * This object is not registered as an access object. - * So the developer should add it to access list manually, using DESC_ACCESS block. - */ - return WIDGET_ERROR_NONE; -} - -static int do_text_update_script(struct widget_data *data, int gbar, Evas_Object *layout, const char *id, const char *part, const char *file, const char *group) -{ - Evas_Object *content; - int ret; - - content = elm_object_part_content_unset(layout, part); - if (content) { - evas_object_del(content); - } - - if (!file || !strlen(file) || access(file, R_OK) != 0) { - ErrPrint("path: %s (%d), Delete old object\n", file, errno); - return WIDGET_ERROR_NONE; - } - - content = elm_layout_add(layout); - if (!content) { - return WIDGET_ERROR_FAULT; - } - - if (elm_layout_file_set(content, file, group) == EINA_FALSE) { - evas_object_del(content); - return WIDGET_ERROR_FAULT; - } - - ret = append_script_object(data, gbar, id, layout, content); - if (ret != WIDGET_ERROR_NONE) { - evas_object_del(content); - return ret; - } - - elm_object_part_content_set(layout, part, content); - /** - * @note - * Do we need to send all script event to the provider? - * - * elm_object_signal_callback_add(obj, "*", "*", script_signal_cb, handle); - */ - return WIDGET_ERROR_NONE; -} - -static int do_text_operate_access(Evas_Object *layout, const char *part, const char *operation, const char *option) -{ - Elm_Access_Action_Info action_info; - int ret; - - memset(&action_info, 0, sizeof(action_info)); - - /* OPERATION is defined in libwidget package */ - if (!strcasecmp(operation, "set,hl")) { - if (part) { - Evas_Object *content; - Evas_Coord x; - Evas_Coord y; - Evas_Coord w; - Evas_Coord h; - - content = elm_object_part_content_get(layout, part); - if (!content) { - ErrPrint("Invalid part: %s\n", part); - return WIDGET_ERROR_NONE; - } - - evas_object_geometry_get(content, &x, &y, &w, &h); - - action_info.x = x + w / 2; - action_info.y = x + h / 2; - } else if (option && sscanf(option, "%dx%d", &action_info.x, &action_info.y) == 2) { - } else { - ErrPrint("Insufficient info for HL\n"); - return WIDGET_ERROR_NONE; - } - - DbgPrint("TXxTY: %dx%d\n", action_info.x, action_info.y); - ret = elm_access_action(layout, ELM_ACCESS_ACTION_HIGHLIGHT, &action_info); - if (ret == EINA_FALSE) { - ErrPrint("Action error\n"); - } - } else if (!strcasecmp(operation, "unset,hl")) { - ret = elm_access_action(layout, ELM_ACCESS_ACTION_UNHIGHLIGHT, &action_info); - if (ret == EINA_FALSE) { - ErrPrint("Action error\n"); - } - } else if (!strcasecmp(operation, "next,hl")) { - action_info.highlight_cycle = (!!option) && (!!strcasecmp(option, "no,cycle")); - - ret = elm_access_action(layout, ELM_ACCESS_ACTION_HIGHLIGHT_NEXT, &action_info); - if (ret == EINA_FALSE) { - ErrPrint("Action error\n"); - } - } else if (!strcasecmp(operation, "prev,hl")) { - action_info.highlight_cycle = EINA_TRUE; - ret = elm_access_action(layout, ELM_ACCESS_ACTION_HIGHLIGHT_PREV, &action_info); - if (ret == EINA_FALSE) { - ErrPrint("Action error\n"); - } - } else if (!strcasecmp(operation, "reset,focus")) { - DbgPrint("Reset Focus\n"); - elm_object_focus_custom_chain_set(layout, NULL); - } - return WIDGET_ERROR_NONE; -} - -static int gbar_text_update_begin(widget_h handle) -{ - struct widget_data *data; - data = get_smart_data_from_handle(handle); - if (!data) { - return WIDGET_ERROR_FAULT; - } - - DbgPrint("Begin text update: [%s]\n", data->widget_id); - - return WIDGET_ERROR_NONE; -} - -static int gbar_text_update_end(widget_h handle) -{ - struct widget_data *data; - data = get_smart_data_from_handle(handle); - if (!data) { - return WIDGET_ERROR_FAULT; - } - - DbgPrint("End text update: [%s]\n", data->widget_id); - - return WIDGET_ERROR_NONE; -} - -static int gbar_text_update_text(widget_h handle, const char *id, const char *part, const char *data) -{ - struct widget_data *widget_data; - Evas_Object *layout; - - widget_data = get_smart_data_from_handle(handle); - if (!widget_data) { - return WIDGET_ERROR_FAULT; - } - - layout = find_script_object(widget_data, 1, id); - if (!layout) { - ErrPrint("Target[%s] is not exists\n", id); - return WIDGET_ERROR_NOT_EXIST; - } - - return do_text_update_text(widget_data->parent, layout, part, data); -} - -static int gbar_text_update_image(widget_h handle, const char *id, const char *part, const char *data, const char *option) -{ - struct widget_data *widget_data; - Evas_Object *layout; - - widget_data = get_smart_data_from_handle(handle); - if (!widget_data) { - return WIDGET_ERROR_FAULT; - } - - layout = find_script_object(widget_data, 1, id); - if (!layout) { - ErrPrint("Target[%s] is not exists\n", id); - return WIDGET_ERROR_NOT_EXIST; - } - - return do_text_update_image(layout, part, data, option); -} - -static int gbar_text_update_script(widget_h handle, const char *id, const char *new_id, const char *part, const char *file, const char *group) -{ - struct widget_data *data; - Evas_Object *layout; - - data = get_smart_data_from_handle(handle); - if (!data) { - return WIDGET_ERROR_FAULT; - } - - layout = find_script_object(data, 1, id); - if (!layout) { - ErrPrint("Target[%s] is not exists\n", id); - return WIDGET_ERROR_NOT_EXIST; - } - - return do_text_update_script(data, 1, layout, new_id, part, file, group); -} - -static int gbar_text_update_signal(widget_h handle, const char *id, const char *signal_name, const char *signal) -{ - struct widget_data *data; - Evas_Object *layout; - - data = get_smart_data_from_handle(handle); - if (!data) { - return WIDGET_ERROR_FAULT; - } - - layout = find_script_object(data, 1, id); - if (!layout) { - ErrPrint("Target[%s] is not exists\n", id); - return WIDGET_ERROR_NOT_EXIST; - } - - elm_object_signal_emit(layout, signal, signal_name); - return WIDGET_ERROR_NONE; -} - -static int gbar_text_update_drag(widget_h handle, const char *id, const char *part, double dx, double dy) -{ - struct widget_data *data; - Evas_Object *layout; - - data = get_smart_data_from_handle(handle); - if (!data) { - return WIDGET_ERROR_FAULT; - } - - layout = find_script_object(data, 1, id); - if (!layout) { - ErrPrint("Target[%s] is not exists\n", id); - return WIDGET_ERROR_NOT_EXIST; - } - - edje_object_part_drag_value_set(elm_layout_edje_get(layout), part, dx, dy); - return WIDGET_ERROR_NONE; -} - -static int gbar_text_update_info_size(widget_h handle, const char *id, int w, int h) -{ - struct widget_data *data; - Evas_Object *layout; - - data = get_smart_data_from_handle(handle); - if (!data) { - return WIDGET_ERROR_FAULT; - } - - layout = find_script_object(data, 1, id); - if (!layout) { - ErrPrint("Target[%s] is not exists\n", id); - return WIDGET_ERROR_NOT_EXIST; - } - - DbgPrint("Resize to %dx%d\n", w, h); - evas_object_resize(layout, w, h); - - return WIDGET_ERROR_NONE; -} - -static int gbar_text_update_info_category(widget_h handle, const char *id, const char *category) -{ - struct widget_data *data; - Evas_Object *layout; - - data = get_smart_data_from_handle(handle); - if (!data) { - return WIDGET_ERROR_FAULT; - } - - layout = find_script_object(data, 1, id); - if (!layout) { - ErrPrint("Target[%s] is not exists\n", id); - return WIDGET_ERROR_NOT_EXIST; - } - - DbgPrint("Update category: %s\n", category); - - return WIDGET_ERROR_NONE; -} - -static int gbar_text_update_access(widget_h handle, const char *id, const char *part, const char *text, const char *option) -{ - struct widget_data *data; - Evas_Object *layout; - - data = get_smart_data_from_handle(handle); - if (!data) { - return WIDGET_ERROR_FAULT; - } - - layout = find_script_object(data, 1, id); - if (!layout) { - ErrPrint("Target[%s] is not exists\n", id); - return WIDGET_ERROR_NOT_EXIST; - } - - return do_text_update_access(data->parent, layout, part, text, option); -} - -static int gbar_text_operate_access(widget_h handle, const char *id, const char *part, const char *operation, const char *option) -{ - struct widget_data *data; - Evas_Object *layout; - - data = get_smart_data_from_handle(handle); - if (!data) { - return WIDGET_ERROR_FAULT; - } - - layout = find_script_object(data, 1, id); - if (!layout) { - ErrPrint("Target[%s] is not exists\n", id); - return WIDGET_ERROR_NOT_EXIST; - } - - return do_text_operate_access(layout, part, operation, option); -} - -static int gbar_text_update_color(widget_h handle, const char *id, const char *part, const char *data) -{ - struct widget_data *widget_data; - Evas_Object *layout; - - widget_data = get_smart_data_from_handle(handle); - if (!widget_data) { - return WIDGET_ERROR_FAULT; - } - - layout = find_script_object(widget_data, 1, id); - if (!layout) { - ErrPrint("Target[%s] is not exists\n", id); - return WIDGET_ERROR_NOT_EXIST; - } - - return do_text_update_color(layout, part, data); -} - -static void gbar_create_text_object(struct widget_data *data) -{ - Evas_Object *gbar_content; - - gbar_content = elm_object_part_content_get(data->gbar_layout, "gbar,content"); - if (!gbar_content) { - char *script_file; - char *script_group; - struct widget_script_operators operator = { - .update_begin = gbar_text_update_begin, - .update_end = gbar_text_update_end, - - .update_text = gbar_text_update_text, - .update_image = gbar_text_update_image, - .update_script = gbar_text_update_script, - .update_signal = gbar_text_update_signal, - .update_drag = gbar_text_update_drag, - .update_info_size = gbar_text_update_info_size, - .update_info_category = gbar_text_update_info_category, - .update_access = gbar_text_update_access, - .operate_access = gbar_text_operate_access, - .update_color = gbar_text_update_color, - }; - int ret; - - gbar_content = elm_layout_add(data->gbar_layout); - if (!gbar_content) { - ErrPrint("Failed to create a layout object\n"); - return; - } - - script_file = widget_service_get_gbar_script_path(data->widget_id); - script_group = widget_service_get_gbar_script_group(data->widget_id); - if (!script_file || !script_group) { - ErrPrint("Invalid script info ([%s] - [%s])\n", script_file, script_group); - free(script_file); - free(script_group); - evas_object_del(gbar_content); - return; - } - - if (access(script_file, R_OK) != 0) { - ErrPrint("Unable to access [%s] - %d\n", script_file, errno); - free(script_file); - free(script_group); - evas_object_del(gbar_content); - return; - } - - ret = elm_layout_file_set(gbar_content, script_file, script_group); - DbgPrint("Load (%s)(%s)\n", script_file, script_group); - free(script_file); - free(script_group); - if (ret == EINA_FALSE) { - ErrPrint("Failed to load an edje file\n"); - evas_object_del(gbar_content); - return; - } - - if (widget_viewer_set_text_handler(data->handle, 1, &operator) != WIDGET_ERROR_NONE) { - ErrPrint("Failed to set text handler for [%s]\n", data->widget_id); - evas_object_del(gbar_content); - return; - } - - ret = append_script_object(data, 1, NULL, NULL, gbar_content); - if (ret != WIDGET_ERROR_NONE) { - ErrPrint("Failed to append this to script object list\n"); - evas_object_del(gbar_content); - return; - } - - elm_object_part_content_set(data->gbar_layout, "gbar,content", gbar_content); - } -} - -static void gbar_create_pixmap_object(struct widget_data *data) -{ - Evas_Object *gbar_content; - - gbar_content = elm_object_part_content_get(data->gbar_layout, "gbar,content"); - if (!gbar_content) { - gbar_content = evas_object_image_filled_add(data->e); - if (!gbar_content) { - ErrPrint("Failed to create an image object\n"); - return; - } - - evas_object_image_colorspace_set(gbar_content, EVAS_COLORSPACE_ARGB8888); - evas_object_image_alpha_set(gbar_content, EINA_TRUE); - elm_object_part_content_set(data->gbar_layout, "gbar,content", gbar_content); - - evas_object_event_callback_add(gbar_content, EVAS_CALLBACK_MOUSE_DOWN, gbar_down_cb, data); - evas_object_event_callback_add(gbar_content, EVAS_CALLBACK_MOUSE_MOVE, gbar_move_cb, data); - evas_object_event_callback_add(gbar_content, EVAS_CALLBACK_MOUSE_UP, gbar_up_cb, data); - - evas_object_event_callback_add(gbar_content, EVAS_CALLBACK_MULTI_DOWN, gbar_multi_down_cb, data); - evas_object_event_callback_add(gbar_content, EVAS_CALLBACK_MULTI_MOVE, gbar_multi_move_cb, data); - evas_object_event_callback_add(gbar_content, EVAS_CALLBACK_MULTI_UP, gbar_multi_up_cb, data); - - evas_object_event_callback_add(gbar_content, EVAS_CALLBACK_DEL, gbar_pixmap_del_cb, data); - } -} - -static void gbar_layout_del_cb(void *_data, Evas *e, Evas_Object *obj, void *event_info) -{ - struct widget_data *data = _data; - DbgPrint("GBar layout is deleted(%p - %p)\n", data->gbar_layout, obj); - /** - * @note - * We should not access the data->gbar_layout in this function. - * We can only believe the "obj" now.. - */ - evas_object_smart_member_del(obj); - evas_object_clip_unset(obj); - data->gbar_layout = NULL; -} - -static void __widget_create_gbar_cb(struct widget *handle, int ret, void *cbdata) -{ - struct widget_data *data = cbdata; - struct widget_evas_event_info info; - widget_type_e widget_type; - - if (data->state != WIDGET_DATA_CREATED) { - ErrPrint("Invalid widget data: %p\n", data); - return; - } - - if (ret != WIDGET_ERROR_NONE) { - DbgPrint("Create GBAR: 0x%X\n", ret); - info.error = ret; - info.event = WIDGET_EVENT_GBAR_CREATED; - info.widget_app_id = data->widget_id; - smart_callback_call(data, WIDGET_SMART_SIGNAL_GBAR_ABORTED, &info); - widget_unref(data); - return; - } - - if (data->is.field.deleted) { - /** - * Evas Object is deleted. - * Do not proceed this process anymore and destroy GBAR too - */ - if (widget_viewer_destroy_glance_bar(data->handle, NULL, NULL) != WIDGET_ERROR_NONE) { - DbgPrint("widget_viewer_destroy_glance_bar failed\n"); - } - return; - } - - DbgPrint("GBAR is created\n"); - - if (!data->gbar_layout) { - data->gbar_layout = elm_layout_add(data->parent); - if (!data->gbar_layout) { - ErrPrint("Failed to add an edje\n"); - info.error = WIDGET_ERROR_FAULT; - info.event = WIDGET_EVENT_GBAR_CREATED; - info.widget_app_id = data->widget_id; - smart_callback_call(data, WIDGET_SMART_SIGNAL_GBAR_ABORTED, &info); - - ret = widget_viewer_destroy_glance_bar(data->handle, __widget_destroy_gbar_cb, widget_ref(data)); - if (ret < 0) { - /*! - * \note - * PREVENT detect this. but it is FALSE POSITIVE - * - * widget_ref will increase the refcnt of data. - * and it is called when calling the widget_destroy_glance_bar function (via the last param) - * So this function call will not release the data. - */ - widget_unref(data); - } - - widget_unref(data); - return; - } - evas_object_event_callback_add(data->gbar_layout, EVAS_CALLBACK_DEL, gbar_layout_del_cb, data); - - if (elm_layout_file_set(data->gbar_layout, WIDGET_VIEWER_EVAS_RESOURCE_EDJ, WIDGET_VIEWER_EVAS_RESOURCE_GBAR) == EINA_FALSE) { - ErrPrint("Failed to load edje object: %s(%s)\n", WIDGET_VIEWER_EVAS_RESOURCE_EDJ, WIDGET_VIEWER_EVAS_RESOURCE_GBAR); - evas_object_del(data->gbar_layout); - data->gbar_layout = NULL; - - info.error = WIDGET_ERROR_IO_ERROR; - info.event = WIDGET_EVENT_GBAR_CREATED; - info.widget_app_id = data->widget_id; - smart_callback_call(data, WIDGET_SMART_SIGNAL_GBAR_ABORTED, &info); - - ret = widget_viewer_destroy_glance_bar(data->handle, __widget_destroy_gbar_cb, widget_ref(data)); - if (ret < 0) { - /*! - * \note - * PREVENT detect this. but it is FALSE POSITIVE - * - * widget_ref will increase the refcnt of data. - * and it is called when calling the widget_destroy_glance_bar function (via the last param) - * So this function call will not release the data. - */ - widget_unref(data); - } - - widget_unref(data); - return; - } - - evas_object_smart_member_add(data->gbar_layout, data->widget); - evas_object_clip_set(data->gbar_layout, data->stage); - elm_object_signal_callback_add(data->gbar_layout, "finished", "animation", gbar_animation_done_cb, data); - evas_object_show(data->gbar_layout); - } - gbar_overlay_loading(data); - - widget_viewer_get_type(data->handle, 1, &widget_type); - - switch (widget_type) { - case WIDGET_CONTENT_TYPE_RESOURCE_ID: - if (!s_info.conf.field.force_to_buffer) { - gbar_create_pixmap_object(data); - break; - } - case WIDGET_CONTENT_TYPE_BUFFER: - gbar_create_buffer_object(data); - break; - case WIDGET_CONTENT_TYPE_TEXT: - gbar_create_text_object(data); - break; - case WIDGET_CONTENT_TYPE_UIFW: - ErrPrint("Not implemented - TYPE_UIFW for GBAR\n"); - default: - info.error = WIDGET_ERROR_INVALID_PARAMETER; - info.event = WIDGET_EVENT_GBAR_CREATED; - info.widget_app_id = data->widget_id; - ret = widget_viewer_destroy_glance_bar(data->handle, __widget_destroy_gbar_cb, widget_ref(data)); - if (ret < 0) { - /*! - * \note - * PREVENT detect this. but it is FALSE POSITIVE - * - * widget_ref will increase the refcnt of data. - * and it is called when calling the widget_destroy_glance_bar function (via the last param) - * So this function call will not release the data. - */ - data = widget_unref(data); - } - ErrPrint("Failed to create a GBAR, unknown type\n"); - if (data) { - smart_callback_call(data, WIDGET_SMART_SIGNAL_GBAR_ABORTED, &info); - data = widget_unref(data); - } - return; - } - - data->is.field.gbar_created = 1; - info.error = WIDGET_ERROR_NONE; - info.event = WIDGET_EVENT_GBAR_CREATED; - info.widget_app_id = data->widget_id; - smart_callback_call(data, WIDGET_SMART_SIGNAL_GBAR_CREATED, &info); - widget_unref(data); -} - -static void update_scroll_flag(struct widget_data *data, int x, int y) -{ - if (s_info.conf.field.is_scroll_x && !s_info.conf.field.is_scroll_y) { - if (!data->is.field.scroll_x && abs(y - data->down.y) > CLICK_REGION && (abs(x - data->down.x) <= CLICK_REGION)) { - data->is.field.cancel_scroll_x = 1; - } - } - - if (s_info.conf.field.is_scroll_y && !s_info.conf.field.is_scroll_x) { - if (!data->is.field.scroll_y && abs(x - data->down.x) > CLICK_REGION && (abs(y - data->down.y) <= CLICK_REGION)) { - data->is.field.cancel_scroll_y = 1; - } - } - - data->is.field.scroll_x = s_info.conf.field.is_scroll_x && (!!(data->is.field.scroll_x || (abs(x - data->down.x) > CLICK_REGION))); - data->is.field.scroll_y = s_info.conf.field.is_scroll_y && (!!(data->is.field.scroll_y || (abs(y - data->down.y) > CLICK_REGION))); - data->is.field.scroll_x = !data->is.field.cancel_scroll_x && data->is.field.scroll_x; - data->is.field.scroll_y = !data->is.field.cancel_scroll_y && data->is.field.scroll_y; -} - -static void __widget_multi_up_cb(void *cbdata, Evas *e, Evas_Object *obj, void *event_info) -{ - Evas_Event_Multi_Up *up = event_info; - struct widget_data *data = cbdata; - Evas_Coord x, y, w, h; - - if (data->state != WIDGET_DATA_CREATED) { - ErrPrint("Invalid widget data: %p\n", data); - return; - } - - if (s_info.conf.field.auto_render_selector) { - DbgPrint("Change to render animator\n"); - s_info.conf.field.render_animator = 1; - } - - if (!IS_PRESSED(data, up->device)) { - return; - } - - SET_RELEASED(data, up->device); - - if (data->handle && !data->is.field.faulted) { - struct widget_mouse_event_info minfo; - - data->x[up->device] = up->canvas.x; - data->y[up->device] = up->canvas.y; - - evas_object_geometry_get(data->widget, &x, &y, &w, &h); - - if (data->size_type != WIDGET_SIZE_TYPE_UNKNOWN && !s_info.conf.field.use_fixed_size) { - minfo.ratio_w = (double)data->fixed_width / (double)w; - minfo.ratio_h = (double)data->fixed_height / (double)h; - DbgPrint("Width: %d/%d - Height: %d/%d\n", data->fixed_width, w, data->fixed_height, h); - } else { - minfo.ratio_w = 1.0f; - minfo.ratio_h = 1.0f; - } - DbgPrint("Ratio: %lfx%lf\n", minfo.ratio_w, minfo.ratio_h); - minfo.device = up->device; - - if (s_info.conf.field.auto_feed && data->is.field.mouse_event) { - /** - * @note - * UNSET will subtract object.x and object.y by master - * so we just send original touch position based on screen - */ - minfo.x = (double)data->x[up->device]; - minfo.y = (double)data->y[up->device]; - DbgPrint("X,Y = %lfx%lf\n", minfo.x, minfo.y); - - widget_viewer_feed_mouse_event(data->handle, WIDGET_MOUSE_UNSET, &minfo); - } else { - /* We have to keep the first position of touch down */ - minfo.x = (double)(data->x[up->device] - x); - minfo.y = (double)(data->y[up->device] - y); - - DbgPrint("%lfx%lf (%lfx%lf)\n", minfo.x, minfo.y, minfo.ratio_w, minfo.ratio_h); - widget_viewer_feed_mouse_event(data->handle, WIDGET_MOUSE_UP, &minfo); - widget_viewer_feed_mouse_event(data->handle, WIDGET_MOUSE_LEAVE, &minfo); - } - } -} - -static void __widget_up_cb(void *cbdata, Evas *e, Evas_Object *obj, void *event_info) -{ - Evas_Event_Mouse_Up *up = event_info; - struct widget_evas_event_info info; - struct widget_data *data = cbdata; - Evas_Coord x, y, w, h; - int ret = 0; - widget_size_type_e size_type; - - if (data->state != WIDGET_DATA_CREATED) { - ErrPrint("Invalid widget data: %p\n", data); - return; - } - - if (!IS_PRESSED(data, 0)) { - return; - } - - update_scroll_flag(data, up->canvas.x, up->canvas.y); - - data->x[0] = up->canvas.x; - data->y[0] = up->canvas.y; - SET_RELEASED(data, 0); - - if (s_info.conf.field.auto_render_selector) { - DbgPrint("Change to render animator\n"); - s_info.conf.field.render_animator = 1; - } - - info.widget_app_id = data->widget_id; - info.event = WIDGET_EVENT_GBAR_CREATED; - - if (s_info.conf.field.support_gbar && data->is.field.flick_down && (data->y[0] - data->down.y) < CLICK_REGION) { - DbgPrint("Flick down is canceled\n"); - data->is.field.flick_down = 0; - info.error = WIDGET_ERROR_CANCELED; - smart_callback_call(data, WIDGET_SMART_SIGNAL_FLICKDOWN_CANCELLED, &info); - } - - evas_object_geometry_get(obj, &x, &y, &w, &h); - - if (data->is.field.flick_down) { - data->is.field.flick_down = 0; - if (!data->handle || data->is.field.faulted || !widget_viewer_has_glance_bar(data->handle)) { - if (!data->is.field.gbar_created && s_info.conf.field.support_gbar) { - elm_object_signal_emit(data->widget_layout, "tilt", "content"); - } - DbgPrint("Flick down is canceled\n"); - info.error = WIDGET_ERROR_CANCELED; - smart_callback_call(data, WIDGET_SMART_SIGNAL_FLICKDOWN_CANCELLED, &info); - } else if (s_info.conf.field.support_gbar && !data->is.field.gbar_created) { - double rx; - double ry; - int gbar_w; - int gbar_h; - - if (widget_viewer_get_glance_bar_size(data->handle, &gbar_w, &gbar_h) != WIDGET_ERROR_NONE) { - gbar_w = 0; - gbar_h = 0; - } - - elm_object_signal_emit(data->widget_layout, "move,down", "content"); - - rx = ((double)x + (double)w / 2.0f) / (double)s_info.screen_width; - DbgPrint("x[%d], w[%d], rx[%lf]\n", x, w, rx); - /* 0.0 0.125 0.25 0.375 0.5 0.625 0.75 0.875 1.0 */ - widget_viewer_get_size_type(data->handle, &size_type); - switch (size_type) { - case WIDGET_SIZE_TYPE_1x1: - if (rx < 0.25f) { - rx = 0.125f; - } else if (rx < 0.5f) { - rx = 0.375f; - } else if (rx < 0.75f) { - rx = 0.625f; - } else if (rx < 1.0f) { - rx = 0.875f; - } - break; - case WIDGET_SIZE_TYPE_2x1: - case WIDGET_SIZE_TYPE_2x2: - if (rx < 0.5f) { - rx = 0.25f; - } else if (rx < 0.625f) { - rx = 0.5f; - } else { - rx = 0.75f; - } - break; - default: - rx = 0.5f; - break; - } - - if (y + h + gbar_h <= s_info.screen_height) { - ry = 0.0f; - } else { - ry = 1.0f; - } - - DbgPrint("converted rx[%lf], ry[%lf]\n", rx, ry); - - ret = widget_viewer_create_glance_bar(data->handle, rx, ry, __widget_create_gbar_cb, widget_ref(data)); - if (ret < 0) { - widget_unref(data); - DbgPrint("Flick down is canceled\n"); - info.error = WIDGET_ERROR_CANCELED; - smart_callback_call(data, WIDGET_SMART_SIGNAL_FLICKDOWN_CANCELLED, &info); - } - DbgPrint("Create GBAR: %d (%lfx%lf)\n", ret, rx, ry); - } - } - - if (data->handle && !data->is.field.faulted) { - struct widget_mouse_event_info minfo; - - if (data->size_type != WIDGET_SIZE_TYPE_UNKNOWN && !s_info.conf.field.use_fixed_size) { - minfo.ratio_w = (double)data->fixed_width / (double)w; - minfo.ratio_h = (double)data->fixed_height / (double)h; - } else { - minfo.ratio_w = 1.0f; - minfo.ratio_h = 1.0f; - } - minfo.device = 0; - - reset_scroller(data); - - if (data->is.field.cancel_click != CANCEL_PROCESSED) { - if (data->down.geo.x != x || data->down.geo.y != y || - data->is.field.scroll_x || data->is.field.scroll_y || - data->is.field.cancel_click == CANCEL_USER || - (!data->is.field.mouse_event && (abs(data->x[0] - data->down.x) > CLICK_REGION || abs(data->y[0] - data->down.y) > CLICK_REGION)) || - (up->event_flags & EVAS_EVENT_FLAG_ON_HOLD) == EVAS_EVENT_FLAG_ON_HOLD) - { - minfo.x = (double)(data->x[0] - x); - minfo.y = (double)(data->y[0] - y); - widget_viewer_feed_mouse_event(data->handle, WIDGET_MOUSE_ON_HOLD, &minfo); - data->is.field.cancel_click = CANCEL_PROCESSED; - } - } - - if (s_info.conf.field.auto_feed && data->is.field.mouse_event) { - /** - * @note - * UNSET will subtract object.x and object.y by master - * so we just send original touch position based on screen - */ - minfo.x = (double)data->x[0]; - minfo.y = (double)data->y[0]; - DbgPrint("X,Y = %lfx%lf\n", minfo.x, minfo.y); - widget_viewer_feed_mouse_event(data->handle, WIDGET_MOUSE_UNSET, &minfo); - } else { - minfo.x = (double)(data->x[0] - x); - minfo.y = (double)(data->y[0] - y); - - DbgPrint("%lfx%lf (%lfx%lf)\n", minfo.x, minfo.y, minfo.ratio_w, minfo.ratio_h); - widget_viewer_feed_mouse_event(data->handle, WIDGET_MOUSE_UP, &minfo); - widget_viewer_feed_mouse_event(data->handle, WIDGET_MOUSE_LEAVE, &minfo); - } - - if (!data->is.field.flick_down) { - ret = WIDGET_ERROR_INVALID_PARAMETER; - if (data->is.field.gbar_created) { - ret = widget_viewer_destroy_glance_bar(data->handle, __widget_destroy_gbar_cb, widget_ref(data)); - if (ret < 0) { - data = widget_unref(data); - } - } else if (data->is.field.cancel_click == CANCEL_DISABLED) { - ret = widget_viewer_send_click_event(data->handle, WIDGET_VIEWER_CLICK_BUTTON_LEFT, minfo.x, minfo.y); - } - } - - if (data) { - DbgPrint("Up: %lfx%lf [x:%d/%d/%d] [y:%d/%d/%d], ret: 0x%X, cancel: 0x%x\n", - minfo.x, minfo.y, - data->is.field.scroll_x, s_info.conf.field.is_scroll_x, data->is.field.cancel_scroll_x, - data->is.field.scroll_y, s_info.conf.field.is_scroll_y, data->is.field.cancel_scroll_y, - ret, data->is.field.cancel_click); - data->is.field.cancel_click = CANCEL_DISABLED; - } - } -} - -static void __widget_multi_move_cb(void *cbdata, Evas *e, Evas_Object *obj, void *event_info) -{ - Evas_Event_Multi_Move *move = event_info; - struct widget_data *data = cbdata; - - if (data->state != WIDGET_DATA_CREATED) { - ErrPrint("Invalid widget data: %p\n", data); - return; - } - - if (!IS_PRESSED(data, move->device)) { - return; - } - - data->x[move->device] = move->cur.canvas.x; - data->y[move->device] = move->cur.canvas.y; - - if (data->handle && !data->is.field.faulted) { - if (!s_info.conf.field.auto_feed && data->is.field.mouse_event) { - struct widget_mouse_event_info minfo; - Evas_Coord x, y, w, h; - - evas_object_geometry_get(obj, &x, &y, &w, &h); - - minfo.x = (double)(data->x[move->device] - x); - minfo.y = (double)(data->y[move->device] - y); - - if (data->size_type != WIDGET_SIZE_TYPE_UNKNOWN && !s_info.conf.field.use_fixed_size) { - minfo.ratio_w = (double)data->fixed_width / (double)w; - minfo.ratio_h = (double)data->fixed_height / (double)h; - } else { - minfo.ratio_w = 1.0f; - minfo.ratio_h = 1.0f; - } - minfo.device = move->device; - - widget_viewer_feed_mouse_event(data->handle, WIDGET_MOUSE_MOVE, &minfo); - } - } else { - if (s_info.conf.field.auto_render_selector) { - s_info.conf.field.render_animator = 1; - } - } -} - -static void __widget_move_cb(void *cbdata, Evas *e, Evas_Object *obj, void *event_info) -{ - Evas_Event_Mouse_Move *move = event_info; - struct widget_data *data = cbdata; - - if (data->state != WIDGET_DATA_CREATED) { - ErrPrint("Invalid widget data: %p\n", data); - return; - } - - if (!IS_PRESSED(data, 0)) { - return; - } - - if (s_info.conf.field.support_gbar && data->is.field.flick_down && data->y[0] - move->cur.canvas.y > 0) { - struct widget_evas_event_info info; - - DbgPrint("Flick down is canceled\n"); - data->is.field.flick_down = 0; - info.widget_app_id = data->widget_id; - info.event = WIDGET_EVENT_GBAR_CREATED; - info.error = WIDGET_ERROR_CANCELED; - - smart_callback_call(data, WIDGET_SMART_SIGNAL_FLICKDOWN_CANCELLED, &info); - } - - update_scroll_flag(data, move->cur.canvas.x, move->cur.canvas.y); - - data->x[0] = move->cur.canvas.x; - data->y[0] = move->cur.canvas.y; - - if (data->handle && !data->is.field.faulted) { - Evas_Coord x, y, w, h; - struct widget_mouse_event_info minfo; - int need_move_event = 0; - - evas_object_geometry_get(obj, &x, &y, &w, &h); - - if (data->size_type != WIDGET_SIZE_TYPE_UNKNOWN && !s_info.conf.field.use_fixed_size) { - minfo.ratio_w = (double)data->fixed_width / (double)w; - minfo.ratio_h = (double)data->fixed_height / (double)h; - } else { - minfo.ratio_w = 1.0f; - minfo.ratio_h = 1.0f; - } - minfo.device = 0; - - if (data->is.field.cancel_click == CANCEL_USER) { - - minfo.x = (double)(data->x[0] - x); - minfo.y = (double)(data->y[0] - y); - widget_viewer_feed_mouse_event(data->handle, WIDGET_MOUSE_ON_HOLD, &minfo); - - /* - * Reset the clicked event - */ - data->is.field.cancel_click = CANCEL_PROCESSED; - - if (s_info.conf.field.auto_render_selector) { - DbgPrint("Change to render animator\n"); - s_info.conf.field.render_animator = 1; - } - - /** - * @note - * After ON_HOLD, we should send one MOVE event. - */ - need_move_event = 1; - } - - if (!s_info.conf.field.auto_feed && (need_move_event || data->is.field.mouse_event)) { - minfo.x = (double)(data->x[0] - x); - minfo.y = (double)(data->y[0] - y); - - widget_viewer_feed_mouse_event(data->handle, WIDGET_MOUSE_MOVE, &minfo); - } - - if (s_info.conf.field.support_gbar && data->is.field.flick_down && abs(data->y[0] - data->down.y) > CLICK_REGION) { - struct widget_evas_event_info info; - data->is.field.flick_down = 0; - info.widget_app_id = data->widget_id; - info.event = WIDGET_EVENT_GBAR_CREATED; - info.error = WIDGET_ERROR_CANCELED; - smart_callback_call(data, WIDGET_SMART_SIGNAL_FLICKDOWN_CANCELLED, &info); - DbgPrint("Flick down is canceled\n"); - } - - } else { - if (s_info.conf.field.auto_render_selector) { - s_info.conf.field.render_animator = 1; - } - } -} - -static char *get_package_icon(struct widget_data *data) -{ - char *icon; - char *uiapp; - - if (data->size_type == WIDGET_SIZE_TYPE_UNKNOWN) { - icon = widget_service_get_icon(data->widget_id, NULL); - } else { - icon = get_preview_image(data, data->size_type); - } - - if (icon && access(icon, R_OK) == 0) { - return icon; - } - - if (icon) { - ErrPrint("Failed to access an icon file: [%s]\n", icon); - free(icon); - icon = NULL; - } - - uiapp = widget_service_get_main_app_id(data->widget_id); - if (uiapp) { - int ret; - pkgmgrinfo_appinfo_h appinfo_h; - - ret = pkgmgrinfo_appinfo_get_appinfo(uiapp, &appinfo_h); - free(uiapp); - - if (ret < 0) { - /** - * 'Icon' will be remained as NULL - */ - } else { - char *uiapp_icon = NULL; - - ret = pkgmgrinfo_appinfo_get_icon(appinfo_h, &uiapp_icon); - if (ret == PMINFO_R_OK && uiapp_icon && access(uiapp_icon, R_OK) == 0) { - DbgPrint("UI-App icon: [%s]\n", uiapp_icon); - icon = strdup(uiapp_icon); - if (!icon) { - ErrPrint("Heap: %d\n", strerror(errno)); - /** - * @note - * 'Icon' will be specified to "unknown" icon file (Default) - */ - } - } else { - ErrPrint("[%s] - %d\n", uiapp_icon, errno); - } - - pkgmgrinfo_appinfo_destroy_appinfo(appinfo_h); - } - } - - if (!icon) { - icon = strdup(WIDGET_VIEWER_EVAS_UNKNOWN); - if (!icon) { - ErrPrint("strdup: %d\n", errno); - } - } - - return icon; -} - -static void activate_ret_cb(struct widget *handle, int ret, void *cbdata) -{ - struct widget_data *data = cbdata; - - if (data->state != WIDGET_DATA_CREATED) { - ErrPrint("Invalid widget data: %p\n", data); - return; - } - - __widget_overlay_disable(data, 1, 1); - - DbgPrint("Activated (%s): %d\n", data->widget_id, ret); - if (!data->is.field.deleted && (ret == WIDGET_ERROR_NONE || ret == WIDGET_ERROR_INVALID_PARAMETER)) { - widget_size_type_e type; - Evas_Coord w, h; - struct acquire_data acquire_data = { - .data = data, - }; - - evas_object_geometry_get(data->widget_layout, NULL, NULL, &w, &h); - - type = find_size_type(data, w, h); - if (type == WIDGET_SIZE_TYPE_UNKNOWN) { - ErrPrint("Failed to find a proper size type: %dx%d\n", w, h); - type = WIDGET_SIZE_TYPE_1x1; - } - - data->is.field.faulted = 0; - data->is.field.created = 0; - data->is.field.send_delete = 1; - update_widget_geometry(&acquire_data); - data->handle = widget_viewer_add_widget(data->widget_id, data->content, - data->cluster, data->category, - data->period, type, - __widget_created_cb, widget_ref(data)); - if (!data->handle) { - ErrPrint("Failed to send add request\n"); - widget_unref(data); - return; - } - - DbgPrint("Added Handle: (%p) %p\n", data->handle, data); - widget_viewer_set_data(data->handle, data->widget); - __widget_overlay_loading(data); - } - - data->is.field.deleted = 0; - widget_unref(data); -} - -static void __widget_animation_done_cb(void *cbdata, Evas_Object *obj, const char *signal_name, const char *source) -{ - struct widget_data *data = cbdata; - - if (data->state != WIDGET_DATA_CREATED) { - ErrPrint("Invalid widget data: %p\n", data); - return; - } - - if (widget_viewer_has_glance_bar(data->handle)) { - } else { - DbgPrint("Animation finished\n"); - } -} - -static void __widget_turn_done_cb(void *cbdata, Evas_Object *obj, const char *signal_name, const char *source) -{ - struct widget_data *data = cbdata; - Evas_Object *overlay; - - if (data->state != WIDGET_DATA_CREATED) { - ErrPrint("Invalid widget data: %p\n", data); - return; - } - - overlay = elm_object_part_content_unset(data->widget_layout, "overlay,content"); - if (overlay) { - evas_object_del(overlay); - data->is.field.widget_overlay_loaded = 0; - } -} - -static void __widget_overlay_clicked_cb(void *cbdata, Evas_Object *obj, const char *signal_name, const char *source) -{ - struct widget_data *data = cbdata; - - if (data->state != WIDGET_DATA_CREATED) { - ErrPrint("Invalid widget data: %p\n", data); - return; - } - - DbgPrint("Overlay is clicked: (%s) (%s)\n", signal_name, source); - if (!data->is.field.faulted) { - /*! - * \todo - * Reload - */ - DbgPrint("Package [%s] is not faulted one\n", data->widget_id); - } else { - DbgPrint("Activate: [%s]\n", data->widget_id); - if (widget_viewer_activate_faulted_widget(data->widget_id, activate_ret_cb, widget_ref(data)) < 0) { - ErrPrint("Failed to activate %s\n", data->widget_id); - widget_unref(data); - } - } -} - -static void widget_layout_del_cb(void *_data, Evas *e, Evas_Object *obj, void *event_info) -{ - struct widget_data *data = _data; - DbgPrint("Layout is deleted (%p - %p)\n", data->widget_layout, obj); - evas_object_smart_member_del(obj); - evas_object_clip_unset(obj); - data->widget_layout = NULL; -} - -static void stage_del_cb(void *_data, Evas *e, Evas_Object *obj, void *event_info) -{ - struct widget_data *data = _data; - - DbgPrint("Stage is deleted (%p - %p)\n", data->stage, obj); - if (data->widget_layout) { - evas_object_clip_unset(data->widget_layout); - } - - evas_object_smart_member_del(obj); - data->stage = NULL; -} - -static void __widget_data_setup(struct widget_data *data) -{ - data->e = evas_object_evas_get(data->widget); - if (!data->e) { - ErrPrint("Failed to get Evas object\n"); - data->state = WIDGET_DATA_DELETED; - free(data); - return; - } - - data->stage = evas_object_rectangle_add(data->e); - if (!data->stage) { - ErrPrint("Failed to add stage object\n"); - data->state = WIDGET_DATA_DELETED; - free(data); - return; - } - - evas_object_color_set(data->stage, 255, 255, 255, 255); - - data->widget_layout = elm_layout_add(data->parent); - if (!data->widget_layout) { - ErrPrint("Failed to add edje object\n"); - evas_object_del(data->stage); - data->state = WIDGET_DATA_DELETED; - free(data); - return; - } - - if (elm_layout_file_set(data->widget_layout, WIDGET_VIEWER_EVAS_RESOURCE_EDJ, WIDGET_VIEWER_EVAS_RESOURCE_LB) == EINA_FALSE) { - ErrPrint("Failed to load edje object: %s(%s)\n", WIDGET_VIEWER_EVAS_RESOURCE_EDJ, WIDGET_VIEWER_EVAS_RESOURCE_LB); - evas_object_del(data->widget_layout); - evas_object_del(data->stage); - data->state = WIDGET_DATA_DELETED; - free(data); - return; - } - - if (!s_info.conf.field.disable_internal_scroller && (s_info.conf.field.is_scroll_x || s_info.conf.field.is_scroll_y)) { - Evas_Object *scroller; - scroller = elm_scroller_add(data->parent); - if (scroller) { - Evas_Object *box; - - elm_scroller_bounce_set(scroller, EINA_FALSE, EINA_FALSE); - elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); - elm_scroller_single_direction_set(scroller, ELM_SCROLLER_SINGLE_DIRECTION_HARD); - /* elm_object_scroll_lock_x_set(scroller, EINA_TRUE); */ - - box = evas_object_rectangle_add(data->e); - if (box) { - int height = 0; - int width = 0; - - if (s_info.conf.field.is_scroll_x) { - height = s_info.screen_height << 1; - } - - if (s_info.conf.field.is_scroll_y) { - width = s_info.screen_width << 1; - } - - evas_object_color_set(box, 0, 0, 0, 0); - evas_object_resize(box, width, height); - evas_object_size_hint_min_set(box, width, height); - evas_object_show(box); - } - - elm_object_content_set(scroller, box); - elm_object_part_content_set(data->widget_layout, "scroller", scroller); - } else { - ErrPrint("Failed to create a scroller\n"); - } - } - - evas_object_show(data->widget_layout); - - elm_object_signal_callback_add(data->widget_layout, "mouse,clicked,1", "overlay,content", __widget_overlay_clicked_cb, data); - elm_object_signal_callback_add(data->widget_layout, "done", "turn", __widget_turn_done_cb, data); - elm_object_signal_callback_add(data->widget_layout, "finished", "animation", __widget_animation_done_cb, data); - - evas_object_event_callback_add(data->widget_layout, EVAS_CALLBACK_MOUSE_DOWN, __widget_down_cb, data); - evas_object_event_callback_add(data->widget_layout, EVAS_CALLBACK_MOUSE_MOVE, __widget_move_cb, data); - evas_object_event_callback_add(data->widget_layout, EVAS_CALLBACK_MOUSE_UP, __widget_up_cb, data); - - evas_object_event_callback_add(data->widget_layout, EVAS_CALLBACK_MULTI_DOWN, __widget_multi_down_cb, data); - evas_object_event_callback_add(data->widget_layout, EVAS_CALLBACK_MULTI_MOVE, __widget_multi_move_cb, data); - evas_object_event_callback_add(data->widget_layout, EVAS_CALLBACK_MULTI_UP, __widget_multi_up_cb, data); - - evas_object_smart_member_add(data->stage, data->widget); - evas_object_smart_member_add(data->widget_layout, data->widget); - evas_object_clip_set(data->widget_layout, data->stage); - - evas_object_event_callback_add(data->widget_layout, EVAS_CALLBACK_DEL, widget_layout_del_cb, data); - evas_object_event_callback_add(data->stage, EVAS_CALLBACK_DEL, stage_del_cb, data); -} - -static Eina_Bool renderer_cb(void *_data) -{ - struct widget_data *data; - - EINA_LIST_FREE(s_info.widget_dirty_objects, data) { - __widget_event_widget_updated(data); - } - - EINA_LIST_FREE(s_info.gbar_dirty_objects, data) { - __widget_event_gbar_updated(data); - } - - s_info.renderer = NULL; - return ECORE_CALLBACK_CANCEL; -} - -static void remove_widget_dirty_object_list(struct widget_data *data) -{ - s_info.widget_dirty_objects = eina_list_remove(s_info.widget_dirty_objects, data); -} - -static void append_widget_dirty_object_list(struct widget_data *data, int idx) -{ - data->is.field.widget_dirty = 1; - - if (idx != WIDGET_KEEP_BUFFER) { - data->widget_latest_idx = idx; - } - - if (widget_viewer_get_visibility(data->handle) != WIDGET_SHOW) { - DbgPrint("Box[%s] is not visible\n", data->widget_id); - return; - } - - if (s_info.conf.field.render_animator) { - if (eina_list_data_find(s_info.widget_dirty_objects, data)) { - return; - } - - if (!s_info.renderer) { - s_info.renderer = ecore_animator_add(renderer_cb, NULL); - if (!s_info.renderer) { - ErrPrint("Failed to create a renderer\n"); - } - } - - s_info.widget_dirty_objects = eina_list_append(s_info.widget_dirty_objects, data); - } else { - if (s_info.renderer) { - ecore_animator_del(s_info.renderer); - s_info.renderer = NULL; - } - - /* Need a choice - * Do we have to discard these all changes? or just flush them? - struct widget_data *item; - EINA_LIST_FREE(s_info.widget_dirty_objects, item) { - __widget_event_widget_updated(item); - } - */ - eina_list_free(s_info.widget_dirty_objects); - s_info.widget_dirty_objects = NULL; - __widget_event_widget_updated(data); - } -} - -static void remove_gbar_dirty_object_list(struct widget_data *data) -{ - s_info.gbar_dirty_objects = eina_list_remove(s_info.gbar_dirty_objects, data); -} - -static void append_gbar_dirty_object_list(struct widget_data *data, int idx) -{ - data->is.field.gbar_dirty = 1; - - if (idx != WIDGET_KEEP_BUFFER) { - data->gbar_latest_idx = idx; - } - - if (widget_viewer_get_visibility(data->handle) != WIDGET_SHOW) { - return; - } - - if (s_info.conf.field.render_animator) { - if (eina_list_data_find(s_info.gbar_dirty_objects, data)) { - return; - } - - if (!s_info.renderer) { - s_info.renderer = ecore_animator_add(renderer_cb, NULL); - if (!s_info.renderer) { - ErrPrint("Failed to create a renderer\n"); - } - } - - s_info.gbar_dirty_objects = eina_list_append(s_info.gbar_dirty_objects, data); - } else { - if (s_info.renderer) { - ecore_animator_del(s_info.renderer); - s_info.renderer = NULL; - } - - /* Need a choice - * Do we have to discard these all changes? or just flush them? - struct widget_data *item; - EINA_LIST_FREE(s_info.gbar_dirty_objects, item) { - __widget_event_gbar_updated(item); - } - */ - eina_list_free(s_info.gbar_dirty_objects); - s_info.gbar_dirty_objects = NULL; - __widget_event_gbar_updated(data); - } -} - -static void __widget_add(Evas_Object *widget) -{ - struct widget_data *data; - - data = calloc(1, sizeof(*data)); - if (!data) { - ErrPrint("Heap: %d\n", errno); - return; - } - - data->state = WIDGET_DATA_CREATED; - data->widget = widget; - data->is.field.permanent_delete = 0; - data->widget_latest_idx = WIDGET_PRIMARY_BUFFER; - data->gbar_latest_idx = WIDGET_PRIMARY_BUFFER; - evas_object_smart_data_set(data->widget, data); - widget_ref(data); - - s_info.list = eina_list_append(s_info.list, widget); - return; -} - -static Evas_Object *create_image_object(struct widget_data *data) -{ - Evas_Object *img; - - img = evas_object_image_filled_add(data->e); - if (!img) { - ErrPrint("Failed to create an image object\n"); - } else { - evas_object_image_colorspace_set(img, EVAS_COLORSPACE_ARGB8888); - evas_object_image_alpha_set(img, EINA_TRUE); - } - - return img; -} - -static void replace_widget_pixmap_with_image(struct widget_data *data) -{ - Evas_Object *img; - Evas_Object *content; - - content = elm_object_part_content_unset(data->widget_layout, "widget,content"); - if (!content) { - ErrPrint("Failed to get content object\n"); - return; - } - - img = create_image_object(data); - if (img) { - Evas_Coord w; - Evas_Coord h; - void *image_data; - - evas_object_image_size_get(content, &w, &h); - evas_object_image_size_set(img, w, h); - - image_data = evas_object_image_data_get(content, 0); - if (image_data) { - evas_object_image_data_copy_set(img, image_data); - } - - evas_object_image_fill_set(img, 0, 0, w, h); - evas_object_image_pixels_dirty_set(img, EINA_TRUE); - evas_object_image_data_update_add(img, 0, 0, w, h); - - elm_object_part_content_set(data->widget_layout, "widget,content", img); - } else { - ErrPrint("Failed to create an image object\n"); - } - - evas_object_del(content); -} - -static void replace_gbar_pixmap_with_image(struct widget_data *data) -{ - Evas_Object *img; - Evas_Object *gbar_content; - - gbar_content = elm_object_part_content_unset(data->widget_layout, "gbar,content"); - if (!gbar_content) { - ErrPrint("Failed to get content object\n"); - return; - } - - img = create_image_object(data); - if (img) { - Evas_Coord w; - Evas_Coord h; - void *content; - - evas_object_image_size_get(gbar_content, &w, &h); - evas_object_image_size_set(img, w, h); - - content = evas_object_image_data_get(gbar_content, 0); - if (content) { - evas_object_image_data_copy_set(img, content); - } - - evas_object_image_fill_set(img, 0, 0, w, h); - evas_object_image_pixels_dirty_set(img, EINA_TRUE); - evas_object_image_data_update_add(img, 0, 0, w, h); - - elm_object_part_content_set(data->widget_layout, "gbar,content", img); - } else { - ErrPrint("Failed to create an image object\n"); - } - - evas_object_del(gbar_content); -} - -static void __widget_destroy_widget_cb(widget_h handle, int ret, void *_data) -{ - struct widget_data *data = _data; - - if (data->state != WIDGET_DATA_CREATED) { - ErrPrint("Invalid widget data: %p\n", data); - return; - } - - if (data->widget_pixmap) { - replace_widget_pixmap_with_image(data); - } - - if (data->gbar_pixmap) { - replace_gbar_pixmap_with_image(data); - } - - data->is.field.send_delete = 0; - DbgPrint("Invoke raw delete %s\n", data->widget_id); - (void)invoke_raw_event_callback(WIDGET_VIEWER_EVAS_RAW_DELETE, data->widget_id, NULL, ret); - remove_widget_dirty_object_list(data); - remove_gbar_dirty_object_list(data); /* for the safety */ - widget_unref(data); -} - -static void __widget_del(Evas_Object *widget) -{ - struct widget_data *data = NULL; - - data = evas_object_smart_data_get(widget); - if (!data) { - ErrPrint("Invalid object\n"); - return; - } - - if (data->state != WIDGET_DATA_CREATED) { - ErrPrint("Invalid widget data: %p\n", data); - return; - } - - if (data->is.field.deleted == 1) { - DbgPrint("Already deleted: %s\n", data->widget_id); - return; - } - - data->is.field.deleted = 1; - - if (data->delayed_resume_timer) { - ecore_timer_del(data->delayed_resume_timer); - data->delayed_resume_timer = NULL; - } - - s_info.list = eina_list_remove(s_info.list, widget); - - if (data->handle) { - widget_viewer_set_data(data->handle, NULL); - - if (data->is.field.send_delete) { - widget_delete_type_e delete_type; - - if (data->is.field.permanent_delete) { - delete_type = WIDGET_DELETE_PERMANENTLY; - } else { - delete_type = WIDGET_DELETE_TEMPORARY; - } - DbgPrint("Send delete request (0x%X) - %s\n", delete_type, data->widget_id); - - if (data->is.field.created) { - if (widget_viewer_delete_widget(data->handle, delete_type, __widget_destroy_widget_cb, widget_ref(data)) < 0) { - widget_unref(data); - data = NULL; - } - } else { - DbgPrint("Not created yet. this will be canceld by created callback, ignore delete callback\n"); - if (widget_viewer_delete_widget(data->handle, delete_type, NULL, NULL) < 0) { - DbgPrint("Unref %p\n", data); - } - } - } else { - DbgPrint("Skip delete request\n"); - } - } else { - DbgPrint("Handle is not created: %s\n", data->widget_id); - if (data->is.field.faulted && data->widget_id) { - /* If a package is faulted. we have to activate it before delete object from here */ - if (widget_viewer_activate_faulted_widget(data->widget_id, NULL, NULL) < 0) { - ErrPrint("Activate: %s\n", data->widget_id); - } - } - } - - /** - * From now, the widget object is not valid - */ - if (data) { - data->widget = NULL; - widget_unref(data); - } -} - -static Eina_Bool delayed_resume_timer_cb(void *_data) -{ - struct widget_data *data = _data; - - (void)widget_viewer_set_visibility(data->handle, WIDGET_SHOW); - - if (data->is.field.widget_dirty) { - /** - * If the object has dirty flag, pumping it up again - * To updates its content - */ - append_widget_dirty_object_list(data, WIDGET_KEEP_BUFFER); - } - - data->delayed_resume_timer = NULL; - return ECORE_CALLBACK_CANCEL; -} - -static void update_visibility(struct widget_data *data) -{ - int is_visible = 0; - int delay; - - if (!data->handle || !data->is.field.created) { - return; - } - - if (data->is.field.freeze_visibility) { - DbgPrint("Freezed visibility: %X (%s)\n", data->freezed_visibility, widget_viewer_get_pkgname(data->handle)); - - if (data->freezed_visibility == WIDGET_VISIBILITY_STATUS_SHOW_FIXED) { - if (data->delayed_resume_timer) { - (void)ecore_timer_del(data->delayed_resume_timer); - data->delayed_resume_timer = NULL; - } - data->is.field.initial_resumed = 1; - (void)widget_viewer_set_visibility(data->handle, WIDGET_SHOW); - } else if (data->freezed_visibility == WIDGET_VISIBILITY_STATUS_HIDE_FIXED) { - if (data->delayed_resume_timer) { - (void)ecore_timer_del(data->delayed_resume_timer); - data->delayed_resume_timer = NULL; - } - (void)widget_viewer_set_visibility(data->handle, WIDGET_HIDE_WITH_PAUSE); - } - return; - } - - is_visible = evas_object_visible_get(data->stage); - - if (is_visible) { - Evas_Coord x, y, w, h; - - evas_object_geometry_get(data->widget_layout, &x, &y, &w, &h); - - if (!s_info.conf.field.user_view_port) { - Ecore_Evas *ee; - - ee = ecore_evas_ecore_evas_get(data->e); - if (ee) { - ecore_evas_geometry_get(ee, &data->view_port.x, &data->view_port.y, &data->view_port.w, &data->view_port.h); - } else { - data->view_port.x = 0; - data->view_port.y = 0; - util_screen_size_get(&data->view_port.w, &data->view_port.h); - ErrPrint("Failed to get view port info (Fallback: %dx%d - %dx%d\n", - data->view_port.x, data->view_port.y, data->view_port.w, data->view_port.h); - } - } - - if (x + w <= data->view_port.x || x >= data->view_port.x + data->view_port.w || y + h <= data->view_port.y || y >= data->view_port.y + data->view_port.h) { - is_visible = 0; - } else { - is_visible = 1; - } - } - - if (data->is.field.delayed_resume == 0) { /* Follow the global configuration */ - delay = s_info.conf.field.delayed_resume; - } else { /* Ignore the global configuration */ - /* 1 : Disable Delayed Pause Resume */ - /* 2 : Enable Delayed Pause Resume */ - delay = (data->is.field.delayed_resume == 2); - } - - if (delay) { - if (is_visible) { - if (data->delayed_resume_timer) { - DbgPrint("Reset timer\n"); - ecore_timer_reset(data->delayed_resume_timer); - } else if (WIDGET_CONF_VISIBILITY_CHANGE_DELAY > 0.0f) { - if (data->is.field.initial_resumed == 0) { - /** - * @note - * If a widget is not resumed before, - * it should be resumed immediately for displaying its contents ASAP. - */ - DbgPrint("First immeidiate resume\n"); - data->is.field.initial_resumed = 1; - delayed_resume_timer_cb(data); - } else { - DbgPrint("Delayed resume (%lf)\n", WIDGET_CONF_VISIBILITY_CHANGE_DELAY); - data->delayed_resume_timer = ecore_timer_add(WIDGET_CONF_VISIBILITY_CHANGE_DELAY, delayed_resume_timer_cb, data); - if (!data->delayed_resume_timer) { - ErrPrint("Failed to add a timer\n"); - delayed_resume_timer_cb(data); - } - } - } else { - delayed_resume_timer_cb(data); - } - } else { - if (data->delayed_resume_timer) { - ecore_timer_del(data->delayed_resume_timer); - data->delayed_resume_timer = NULL; - } - - widget_viewer_set_visibility(data->handle, WIDGET_HIDE_WITH_PAUSE); - } - } else { - /** - * @note - * In this case, if there is any registered timer, - * this function should clear it. - * Timer means that the delayed_resume mode is changed. - */ - if (data->delayed_resume_timer) { - ecore_timer_del(data->delayed_resume_timer); - data->delayed_resume_timer = NULL; - DbgPrint("Clear timer of delayed resuming\n"); - } - - if (is_visible) { - delayed_resume_timer_cb(data); - } else { - widget_viewer_set_visibility(data->handle, WIDGET_HIDE_WITH_PAUSE); - } - } -} - -static int do_force_mouse_up(struct widget_data *data) -{ - struct widget_mouse_event_info minfo; - Evas_Coord x, y, w, h; - struct widget_evas_event_info info; - int i; - - if (s_info.conf.field.auto_render_selector && s_info.conf.field.render_animator == 0) { - DbgPrint("Change to render animator\n"); - s_info.conf.field.render_animator = 1; - } - - if (!data->pressed) { - /** - * @note - * No buttons are pressed or there is no touch. - */ - return WIDGET_ERROR_INVALID_PARAMETER; - } - - /** - * @todo - * What happens if this is called for GBar? - */ - evas_object_geometry_get(data->widget, &x, &y, &w, &h); - - /** - * @note - * If the GBar is pressed, we don't need to calculate the ratio. - */ - if (!data->down.is_gbar && (data->size_type != WIDGET_SIZE_TYPE_UNKNOWN && !s_info.conf.field.use_fixed_size)) { - minfo.ratio_w = (double)data->fixed_width / (double)w; - minfo.ratio_h = (double)data->fixed_height / (double)h; - DbgPrint("Width: %d/%d - Height: %d/%d\n", data->fixed_width, w, data->fixed_height, h); - } else { - minfo.ratio_w = 1.0f; - minfo.ratio_h = 1.0f; - } - DbgPrint("Ratio: %lfx%lf\n", minfo.ratio_w, minfo.ratio_h); - - DbgPrint("%x\n", data->is.field.cancel_click); - if (data->is.field.cancel_click != CANCEL_PROCESSED) { - DbgPrint("ON_HOLD send\n"); - minfo.device = 0; - minfo.x = (double)(data->x[0] - x); - minfo.y = (double)(data->y[0] - y); - - widget_viewer_feed_mouse_event(data->handle, WIDGET_MOUSE_ON_HOLD, &minfo); - data->is.field.cancel_click = CANCEL_PROCESSED; - } - - reset_scroller(data); - - if (s_info.conf.field.auto_feed && data->is.field.mouse_event) { - for (i = 0; i < MAX_DEVICE; i++) { - if (IS_PRESSED(data, i)) { - /** - * @note - * UNSET will subtract object.x and object.y by master - * so we just send original touch position based on screen - */ - minfo.x = (double)data->x[i]; - minfo.y = (double)data->y[i]; - DbgPrint("X,Y = %lfx%lf\n", minfo.x, minfo.y); - minfo.device = i; - - widget_viewer_feed_mouse_event(data->handle, WIDGET_MOUSE_UNSET, &minfo); - } - } - } else { - DbgPrint("%lfx%lf (%lfx%lf)\n", minfo.x, minfo.y, minfo.ratio_w, minfo.ratio_h); - for (i = 0; i < MAX_DEVICE; i++) { - if (IS_PRESSED(data, i)) { - minfo.x = (double)(data->x[i] - x); - minfo.y = (double)(data->y[i] - y); - minfo.device = i; - - widget_viewer_feed_mouse_event(data->handle, WIDGET_MOUSE_UP, &minfo); - widget_viewer_feed_mouse_event(data->handle, WIDGET_MOUSE_LEAVE, &minfo); - } - } - } - - data->pressed = 0; - data->is.field.cancel_click = CANCEL_DISABLED; - - if (s_info.conf.field.support_gbar && data->is.field.flick_down) { - data->is.field.flick_down = 0; - info.widget_app_id = data->widget_id; - info.event = WIDGET_EVENT_GBAR_CREATED; - info.error = WIDGET_ERROR_CANCELED; - smart_callback_call(data, WIDGET_SMART_SIGNAL_FLICKDOWN_CANCELLED, &info); - DbgPrint("Flick down is canceled\n"); - } - - return WIDGET_ERROR_NONE; -} - -static void __widget_move(Evas_Object *widget, Evas_Coord x, Evas_Coord y) -{ - struct widget_data *data; - Evas_Coord w, h; - - data = evas_object_smart_data_get(widget); - if (!data) { - ErrPrint("Invalid object\n"); - return; - } - - if (data->state != WIDGET_DATA_CREATED) { - ErrPrint("Invalid widget data: %p\n", data); - return; - } - - if (data->gbar_layout) { - Evas_Coord gbar_x, gbar_y, gbar_h; - Evas_Coord prev_x, prev_y; - Evas_Coord widget_w, widget_h; - double rx; - double ry; - - evas_object_geometry_get(data->widget_layout, &prev_x, &prev_y, &widget_w, &widget_h); - evas_object_geometry_get(data->gbar_layout, &gbar_x, &gbar_y, NULL, &gbar_h); - - gbar_x += (x - prev_x); - gbar_y += (y - prev_y); - - evas_object_move(data->gbar_layout, gbar_x, gbar_y); - - rx = ((double)x + (double)widget_w / 2.0f) / s_info.screen_width; - switch (find_size_type(data, widget_w, widget_h)) { - case WIDGET_SIZE_TYPE_1x1: - if (rx < 0.25f) { - rx = 0.125f; - } else if (rx < 0.5f) { - rx = 0.375f; - } else if (rx < 0.75f) { - rx = 0.625f; - } else if (rx < 1.0f) { - rx = 0.875f; - } - break; - case WIDGET_SIZE_TYPE_2x1: - case WIDGET_SIZE_TYPE_2x2: - if (rx < 0.5f) { - rx = 0.25f; - } else if (rx < 0.75f) { - rx = 0.5f; - } else { - rx = 0.75f; - } - break; - default: - rx = 0.5f; - break; - } - - if (prev_y + widget_h + gbar_h > s_info.screen_height) { - ry = 1.0f; - } else { - ry = 0.0f; - } - - if (data->is.field.gbar_created) { - widget_viewer_move_glance_bar(data->handle, rx, ry); - } - } - - evas_object_move(data->stage, x, y); - evas_object_move(data->widget_layout, x, y); - evas_object_geometry_get(data->widget_layout, NULL, NULL, &w, &h); - - if (!s_info.conf.field.manual_pause_resume) { - update_visibility(data); - } - - if (s_info.conf.field.sensitive_move) { - do_force_mouse_up(data); - } -} - -static int widget_create_plug_object(struct widget_data *data) -{ - struct acquire_data acquire_data = { - .w = 0, - .h = 0, - .content = NULL, - .data = data, - }; - - DbgPrint("Plug type created\n"); - - acquire_data.content = elm_object_part_content_unset(data->widget_layout, "widget,content"); - if (acquire_data.content) { - DbgPrint("widget Content is already prepared: %s\n", widget_viewer_get_filename(data->handle)); - evas_object_del(acquire_data.content); - } - - acquire_data.content = elm_plug_add(s_info.win); - if (!acquire_data.content) { - ErrPrint("Failed to add a plug object\n"); - return WIDGET_ERROR_FAULT; - } - - DbgPrint("Try to connect to %s\n", widget_viewer_get_filename(data->handle)); - if (!elm_plug_connect(acquire_data.content, widget_viewer_get_filename(data->handle), 0, EINA_TRUE)) { - ErrPrint("Cannot connect plug[%s]", widget_viewer_get_filename(data->handle)); - evas_object_del(acquire_data.content); - return WIDGET_ERROR_FAULT; - } - - elm_object_part_content_set(data->widget_layout, "widget,content", acquire_data.content); - - acquire_data.w = data->widget_width; - acquire_data.h = data->widget_height; - update_widget_geometry(&acquire_data); - return WIDGET_ERROR_NONE; -} - -static int widget_create_image_object(struct widget_data *data) -{ - Evas_Object *front_image; - struct acquire_data acquire_data = { - .w = 0, - .h = 0, - .content = NULL, - .data = data, - }; - - DbgPrint("Image type created\n"); - - acquire_data.content = elm_object_part_content_get(data->widget_layout, "widget,content"); - if (!acquire_data.content) { - acquire_data.content = elm_layout_add(data->parent); - if (!acquire_data.content) { - ErrPrint("Failed to create an edje object\n"); - return WIDGET_ERROR_FAULT; - } - - if (elm_layout_file_set(acquire_data.content, WIDGET_VIEWER_EVAS_RESOURCE_EDJ, WIDGET_VIEWER_EVAS_RESOURCE_IMG) == EINA_FALSE) { - ErrPrint("Failed to load edje object: %s(%s)\n", WIDGET_VIEWER_EVAS_RESOURCE_EDJ, WIDGET_VIEWER_EVAS_RESOURCE_IMG); - evas_object_del(acquire_data.content); - return WIDGET_ERROR_IO_ERROR; - } - - front_image = elm_image_add(acquire_data.content); - if (!front_image) { - ErrPrint("Failed to add front_image object\n"); - evas_object_del(acquire_data.content); - return WIDGET_ERROR_FAULT; - } - - DbgPrint("Default size %dx%d\n", data->widget_width, data->widget_height); - - elm_object_part_content_set(acquire_data.content, "front,content", front_image); - elm_object_part_content_set(data->widget_layout, "widget,content", acquire_data.content); - } else { - front_image = elm_object_part_content_get(acquire_data.content, "front,content"); - if (!front_image) { - ErrPrint("Unable to get front,content object\n"); - front_image = elm_image_add(acquire_data.content); - if (!front_image) { - ErrPrint("Failed to add front_image object\n"); - return WIDGET_ERROR_FAULT; - } - - elm_object_part_content_set(acquire_data.content, "front,content", front_image); - } - } - - /* - evas_object_geometry_get(data->widget, NULL, NULL, &acquire_data.w, &acquire_data.h); - DbgPrint("Default size %dx%d\n", acquire_data.w, acquire_data.h); - DbgPrint("Image size: %dx%d\n", acquire_data.w, acquire_data.h); - */ - acquire_data.w = data->widget_width; - acquire_data.h = data->widget_height; - update_widget_geometry(&acquire_data); - return WIDGET_ERROR_NONE; -} - -static int widget_create_buffer_object(struct widget_data *data) -{ - Evas_Object *content; - - content = elm_object_part_content_get(data->widget_layout, "widget,content"); - if (!content) { - content = evas_object_image_filled_add(data->e); - if (!content) { - ErrPrint("Failed to create an image object\n"); - return WIDGET_ERROR_FAULT; - } - - evas_object_image_colorspace_set(content, EVAS_COLORSPACE_ARGB8888); - evas_object_image_alpha_set(content, EINA_TRUE); - elm_object_part_content_set(data->widget_layout, "widget,content", content); - } - - return WIDGET_ERROR_NONE; -} - -static int widget_text_update_begin(widget_h handle) -{ - struct widget_data *data; - data = get_smart_data_from_handle(handle); - if (!data) { - return WIDGET_ERROR_FAULT; - } - - DbgPrint("Begin text update: [%s]\n", data->widget_id); - - return WIDGET_ERROR_NONE; -} - -static int widget_text_update_end(widget_h handle) -{ - struct widget_data *data; - data = get_smart_data_from_handle(handle); - if (!data) { - return WIDGET_ERROR_FAULT; - } - - DbgPrint("End text update: [%s]\n", data->widget_id); - - return WIDGET_ERROR_NONE; -} - -static int widget_text_update_text(widget_h handle, const char *id, const char *part, const char *data) -{ - struct widget_data *widget_data; - Evas_Object *layout; - - widget_data = get_smart_data_from_handle(handle); - if (!widget_data) { - return WIDGET_ERROR_FAULT; - } - - layout = find_script_object(widget_data, 0, id); - if (!layout) { - ErrPrint("Target[%s] is not exists\n", id); - return WIDGET_ERROR_NOT_EXIST; - } - - return do_text_update_text(widget_data->parent, layout, part, data); -} - -static int widget_text_update_image(widget_h handle, const char *id, const char *part, const char *data, const char *option) -{ - struct widget_data *widget_data; - Evas_Object *layout; - - widget_data = get_smart_data_from_handle(handle); - if (!widget_data) { - return WIDGET_ERROR_FAULT; - } - - layout = find_script_object(widget_data, 0, id); - if (!layout) { - ErrPrint("Target[%s] is not exists\n", id); - return WIDGET_ERROR_NOT_EXIST; - } - - return do_text_update_image(layout, part, data, option); -} - -static int widget_text_update_script(widget_h handle, const char *id, const char *new_id, const char *part, const char *file, const char *group) -{ - struct widget_data *data; - Evas_Object *layout; - - data = get_smart_data_from_handle(handle); - if (!data) { - return WIDGET_ERROR_FAULT; - } - - layout = find_script_object(data, 0, id); - if (!layout) { - ErrPrint("Target[%s] is not exists\n", id); - return WIDGET_ERROR_NOT_EXIST; - } - - return do_text_update_script(data, 0, layout, new_id, part, file, group); -} - -static int widget_text_update_signal(widget_h handle, const char *id, const char *signal_name, const char *signal) -{ - struct widget_data *data; - Evas_Object *layout; - - data = get_smart_data_from_handle(handle); - if (!data) { - return WIDGET_ERROR_FAULT; - } - - layout = find_script_object(data, 0, id); - if (!layout) { - ErrPrint("Target[%s] is not exists\n", id); - return WIDGET_ERROR_NOT_EXIST; - } - - elm_object_signal_emit(layout, signal, signal_name); - return WIDGET_ERROR_NONE; -} - -static int widget_text_update_drag(widget_h handle, const char *id, const char *part, double dx, double dy) -{ - struct widget_data *data; - Evas_Object *layout; - - data = get_smart_data_from_handle(handle); - if (!data) { - return WIDGET_ERROR_FAULT; - } - - layout = find_script_object(data, 0, id); - if (!layout) { - ErrPrint("Target[%s] is not exists\n", id); - return WIDGET_ERROR_NOT_EXIST; - } - - edje_object_part_drag_value_set(elm_layout_edje_get(layout), part, dx, dy); - return WIDGET_ERROR_NONE; -} - -static int widget_text_update_info_size(widget_h handle, const char *id, int w, int h) -{ - struct widget_data *data; - Evas_Object *layout; - - data = get_smart_data_from_handle(handle); - if (!data) { - return WIDGET_ERROR_FAULT; - } - - layout = find_script_object(data, 0, id); - if (!layout) { - ErrPrint("Target[%s] is not exists\n", id); - return WIDGET_ERROR_NOT_EXIST; - } - - DbgPrint("Resize to %dx%d\n", w, h); - evas_object_resize(layout, w, h); - - return WIDGET_ERROR_NONE; -} - -static int widget_text_update_info_category(widget_h handle, const char *id, const char *category) -{ - struct widget_data *data; - Evas_Object *layout; - - data = get_smart_data_from_handle(handle); - if (!data) { - return WIDGET_ERROR_FAULT; - } - - layout = find_script_object(data, 0, id); - if (!layout) { - ErrPrint("Target[%s] is not exists\n", id); - return WIDGET_ERROR_NOT_EXIST; - } - - DbgPrint("Update category: %s\n", category); - - return WIDGET_ERROR_NONE; -} - -static int widget_text_update_access(widget_h handle, const char *id, const char *part, const char *text, const char *option) -{ - struct widget_data *data; - Evas_Object *layout; - - data = get_smart_data_from_handle(handle); - if (!data) { - return WIDGET_ERROR_FAULT; - } - - layout = find_script_object(data, 0, id); - if (!layout) { - ErrPrint("Target[%s] is not exists\n", id); - return WIDGET_ERROR_NOT_EXIST; - } - - return do_text_update_access(data->parent, layout, part, text, option); -} - -static int widget_text_operate_access(widget_h handle, const char *id, const char *part, const char *operation, const char *option) -{ - struct widget_data *data; - Evas_Object *layout; - - data = get_smart_data_from_handle(handle); - if (!data) { - return WIDGET_ERROR_FAULT; - } - - layout = find_script_object(data, 0, id); - if (!layout) { - ErrPrint("Target[%s] is not exists\n", id); - return WIDGET_ERROR_NOT_EXIST; - } - - return do_text_operate_access(layout, part, operation, option); -} - -static int widget_text_update_color(widget_h handle, const char *id, const char *part, const char *data) -{ - struct widget_data *widget_data; - Evas_Object *layout; - - widget_data = get_smart_data_from_handle(handle); - if (!widget_data) { - return WIDGET_ERROR_FAULT; - } - - layout = find_script_object(widget_data, 0, id); - if (!layout) { - ErrPrint("Target[%s] is not exists\n", id); - return WIDGET_ERROR_NOT_EXIST; - } - - return do_text_update_color(layout, part, data); -} -static int widget_create_text_object(struct widget_data *data) -{ - Evas_Object *content; - - content = elm_object_part_content_get(data->widget_layout, "widget,content"); - if (!content) { - int ret; - char *script_file; - char *script_group; - struct widget_script_operators operator = { - .update_begin = widget_text_update_begin, - .update_end = widget_text_update_end, - - .update_text = widget_text_update_text, - .update_image = widget_text_update_image, - .update_script = widget_text_update_script, - .update_signal = widget_text_update_signal, - .update_drag = widget_text_update_drag, - .update_info_size = widget_text_update_info_size, - .update_info_category = widget_text_update_info_category, - .update_access = widget_text_update_access, - .operate_access = widget_text_operate_access, - .update_color = widget_text_update_color, - }; - - content = elm_layout_add(data->widget_layout); - if (!content) { - ErrPrint("Failed to create a layout object\n"); - return WIDGET_ERROR_FAULT; - } - - script_file = widget_service_get_widget_script_path(data->widget_id); - script_group = widget_service_get_widget_script_group(data->widget_id); - if (!script_file || !script_group) { - ErrPrint("Invalid script info ([%s] - [%s])\n", script_file, script_group); - free(script_file); - free(script_group); - evas_object_del(content); - return WIDGET_ERROR_FAULT; - } - - if (access(script_file, R_OK) != 0) { - ErrPrint("Unable to access [%s] - %d\n", script_file, errno); - free(script_file); - free(script_group); - evas_object_del(content); - return WIDGET_ERROR_FAULT; - } - - ret = elm_layout_file_set(content, script_file, script_group); - DbgPrint("Load edje file ([%s] - [%s])\n", script_file, script_group); - free(script_file); - free(script_group); - if (ret == EINA_FALSE) { - ErrPrint("Failed to load EDJE\n"); - evas_object_del(content); - return WIDGET_ERROR_FAULT; - } - - ret = widget_viewer_set_text_handler(data->handle, 0, &operator); - if (ret != WIDGET_ERROR_NONE) { - ErrPrint("Failed to set text handler for [%s]\n", data->widget_id); - evas_object_del(content); - return ret; - } - - ret = append_script_object(data, 0, NULL, NULL, content); - if (ret != WIDGET_ERROR_NONE) { - ErrPrint("Failed to append this to script object list\n"); - evas_object_del(content); - return ret; - } - - elm_object_part_content_set(data->widget_layout, "widget,content", content); - } - - return WIDGET_ERROR_NONE; -} - -static int widget_create_pixmap_object(struct widget_data *data) -{ - Evas_Object *content; - - content = elm_object_part_content_get(data->widget_layout, "widget,content"); - if (!content) { - content = evas_object_image_filled_add(data->e); - if (!content) { - ErrPrint("Failed to create an image object\n"); - return WIDGET_ERROR_FAULT; - } - - evas_object_image_colorspace_set(content, EVAS_COLORSPACE_ARGB8888); - evas_object_image_alpha_set(content, EINA_TRUE); - evas_object_event_callback_add(content, EVAS_CALLBACK_DEL, __widget_pixmap_del_cb, data); - - elm_object_part_content_set(data->widget_layout, "widget,content", content); - } - - return WIDGET_ERROR_NONE; -} - -static void __widget_resize_pixmap_object(struct widget_data *data) -{ - DbgPrint("widget resize request is succssfully sent\n"); -} - -static void update_widget_pixmap(Evas_Object *content, int w, int h) -{ - evas_object_image_pixels_dirty_set(content, EINA_TRUE); - evas_object_image_data_update_add(content, 0, 0, w, h); - evas_object_show(content); -} - -static void acquire_widget_extra_resource_cb(struct widget *handle, int pixmap, void *cbdata) -{ - DbgPrint("Acquired: %u\n", (unsigned int)pixmap); -} - -static void acquire_gbar_extra_resource_cb(struct widget *handle, int pixmap, void *cbdata) -{ - DbgPrint("Acquired: %u\n", (unsigned int)pixmap); -} - -static void replace_pixmap(struct widget *handle, int gbar, Evas_Object *content, unsigned int pixmap) -{ - unsigned int old_pixmap; - - old_pixmap = util_replace_native_surface(handle, gbar, content, pixmap); - if (!s_info.conf.field.skip_acquire && old_pixmap != 0u) { - widget_viewer_release_resource_id(handle, gbar, old_pixmap); - } -} - -static void acquire_widget_pixmap_cb(struct widget *handle, int pixmap, void *cbdata) -{ - struct acquire_data *acquire_data = cbdata; - struct widget_data *data = acquire_data->data; - - data->is.field.widget_pixmap_acquire_requested = 0; - __widget_overlay_disable(data, 0, 0); - - if (pixmap == 0) { - DbgPrint("Pixmap gotten (0)\n"); - if (!s_info.conf.field.skip_acquire) { - free(acquire_data); - } - widget_unref(data); - return; - } - - evas_object_image_size_set(acquire_data->content, acquire_data->w, acquire_data->h); - evas_object_image_fill_set(acquire_data->content, 0, 0, acquire_data->w, acquire_data->h); - DbgPrint("fillset: %dx%d\n", acquire_data->w, acquire_data->h); - - replace_pixmap(handle, 0, acquire_data->content, (unsigned int)pixmap); - - data->widget_pixmap = pixmap; - - append_widget_dirty_object_list(data, WIDGET_KEEP_BUFFER); - update_widget_geometry(acquire_data); - - widget_unref(data); - if (!s_info.conf.field.skip_acquire) { - free(acquire_data); - } - - if (WIDGET_CONF_ENABLE_RESOURCE_LOCK) { - if (!eina_list_data_find(s_info.updated_pixmap_list, (void *)(PTR_TYPE(pixmap)))) { - s_info.updated_pixmap_list = eina_list_append(s_info.updated_pixmap_list, (void *)(PTR_TYPE(pixmap))); - } - } -} - -static void __widget_update_pixmap_object(struct widget_data *data, Evas_Object *widget_content, int w, int h) -{ - int ret; - struct acquire_data *acquire_data; - - if (data->widget_latest_idx == WIDGET_PRIMARY_BUFFER) { - unsigned int resource_id = 0u; - - if (widget_viewer_get_resource_id(data->handle, 0, &resource_id) < 0) { - ErrPrint("Failed to get resource_id\n"); - } else if (resource_id > 0) { - if (data->widget_pixmap == resource_id) { - if (data->widget_extra) { - /* Just replace the pixmap in this case, do not release old pixmap */ - replace_pixmap(NULL, 0, widget_content, data->widget_pixmap); - } - - update_widget_pixmap(widget_content, w, h); - - if (WIDGET_CONF_ENABLE_RESOURCE_LOCK) { - if (!eina_list_data_find(s_info.updated_pixmap_list, (void *)(PTR_TYPE(resource_id)))) { - s_info.updated_pixmap_list = eina_list_append(s_info.updated_pixmap_list, (void *)(PTR_TYPE(resource_id))); - } - } - return; - } - - if (s_info.conf.field.skip_acquire && resource_id != 0) { - struct acquire_data local_acquire_data = { - .data = widget_ref(data), - .content = widget_content, - .w = w, - .h = h, - }; - - /** - * @note - * Resource lock will be acquired from below callback. - */ - acquire_widget_pixmap_cb(data->handle, resource_id, &local_acquire_data); - return; - } - - if (data->is.field.widget_pixmap_acquire_requested) { - DbgPrint("Pixmap is not acquired (in-process)\n"); - return; - } - - acquire_data = malloc(sizeof(*acquire_data)); - if (!acquire_data) { - ErrPrint("malloc: %d\n", errno); - return; - } - - acquire_data->data = widget_ref(data); - acquire_data->content = widget_content; - acquire_data->w = w; - acquire_data->h = h; - - ret = widget_viewer_acquire_resource_id(data->handle, 0, acquire_widget_pixmap_cb, acquire_data); - if (ret != WIDGET_ERROR_NONE) { - widget_unref(data); - free(acquire_data); - } else { - data->is.field.widget_pixmap_acquire_requested = 1; - } - - /** - * @note - * Resource lock should be acquired from acquire_widget_pixmap_cb - */ - } - } else { - if (!data->widget_extra) { - ErrPrint("Extra buffer is not prepared yet\n"); - return; - } - - replace_pixmap(NULL, 0, widget_content, data->widget_extra[data->widget_latest_idx]); - update_widget_pixmap(widget_content, w, h); - if (WIDGET_CONF_ENABLE_RESOURCE_LOCK) { - if (!eina_list_data_find(s_info.updated_pixmap_list, (void *)(PTR_TYPE(data->widget_extra[data->widget_latest_idx])))) { - s_info.updated_pixmap_list = eina_list_append(s_info.updated_pixmap_list, (void *)(PTR_TYPE(data->widget_extra[data->widget_latest_idx]))); - } - } - } - -} - -static int widget_system_created(struct widget *handle, struct widget_data *data) -{ - int ret; - struct widget_evas_event_info info; - widget_type_e widget_type; - - if (data->state != WIDGET_DATA_CREATED) { - ErrPrint("Invalid widget data: %p, %s\n", data, widget_viewer_get_pkgname(handle)); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - widget_viewer_get_size_type(handle, &data->size_type); - - if (data->size_type == WIDGET_SIZE_TYPE_UNKNOWN || widget_service_get_size(data->size_type, &data->widget_width, &data->widget_height) < 0) { - ErrPrint("Failed to get size info: %s\n", widget_viewer_get_pkgname(handle)); - - } else { - DbgPrint("System created WIDGET size is (%d)%dx%d\n", data->size_type, data->widget_width, data->widget_height); - } - - widget_viewer_get_type(handle, 0, &widget_type); - - switch (widget_type) { - case WIDGET_CONTENT_TYPE_IMAGE: - ret = widget_create_image_object(data); - break; - case WIDGET_CONTENT_TYPE_RESOURCE_ID: - if (!s_info.conf.field.force_to_buffer) { - ret = widget_create_pixmap_object(data); - break; - } - case WIDGET_CONTENT_TYPE_BUFFER: - ret = widget_create_buffer_object(data); - break; - case WIDGET_CONTENT_TYPE_TEXT: - ret = widget_create_text_object(data); - break; - case WIDGET_CONTENT_TYPE_UIFW: - ret = widget_create_plug_object(data); - break; - case WIDGET_CONTENT_TYPE_INVALID: - default: - ret = WIDGET_ERROR_INVALID_PARAMETER; - break; - } - - if (ret == WIDGET_ERROR_NONE) { - info.error = WIDGET_ERROR_NONE; - info.widget_app_id = data->widget_id; - info.event = WIDGET_EVENT_CREATED; - - data->is.field.created = 1; - - update_visibility(data); - smart_callback_call(data, WIDGET_SMART_SIGNAL_WIDGET_CREATED, &info); - - /** - * In case of using the direct update path, - * sometimes the provider can send the updated event faster than created event. - * In that case, the viewer cannot recognize the updated content of a widget. - * So for the safety, I added this to forcely update the widget at the first time - * Right after creating its instance. - */ - append_widget_dirty_object_list(data, WIDGET_PRIMARY_BUFFER); - } - - return ret; -} - -static void __widget_created_cb(struct widget *handle, int ret, void *cbdata) -{ - struct widget_data *data = cbdata; - struct widget_evas_event_info info; - widget_type_e widget_type; - - if (data->state != WIDGET_DATA_CREATED) { - ErrPrint("Invalid widget data: %p (%d), %s\n", data, ret, widget_viewer_get_pkgname(handle)); - return; - } - - if (ret != WIDGET_ERROR_NONE) { - DbgPrint("Failed to create: %X\n", ret); - data->handle = NULL; - - if (!data->is.field.deleted) { - struct widget_evas_event_info fault_event; - - fault_event.error = ret; - fault_event.widget_app_id = data->widget_id; - fault_event.event = WIDGET_EVENT_CREATED; - - if (!data->is.field.faulted) { - data->is.field.faulted = 1; - - DbgPrint("Display tap to load (%p) [%s]\n", data, data->widget_id); - smart_callback_call(data, WIDGET_SMART_SIGNAL_WIDGET_CREATE_ABORTED, &fault_event); - - __widget_overlay_faulted(data); - } else { - smart_callback_call(data, WIDGET_SMART_SIGNAL_WIDGET_CREATE_ABORTED, &fault_event); - - /** - * @note - * While processing the faulted smart callback, the user can request hide_faulted_overlay - * So we should reset it from here. in other cases, the widget_overlay_faulted function deals with this. - */ - data->is.field.hide_faulted_overlay = 0; - } - - ret = WIDGET_ERROR_FAULT; - } else { - ret = WIDGET_ERROR_CANCELED; - } - - data->is.field.send_delete = 0; - DbgPrint("Invoke raw delete %s\n", data->widget_id); - (void)invoke_raw_event_callback(WIDGET_VIEWER_EVAS_RAW_DELETE, data->widget_id, data->widget, ret); - widget_unref(data); - return; - } - - widget_viewer_get_type(handle, 0, &widget_type); - - switch (widget_type) { - case WIDGET_CONTENT_TYPE_IMAGE: - ret = widget_create_image_object(data); - break; - case WIDGET_CONTENT_TYPE_RESOURCE_ID: - if (!s_info.conf.field.force_to_buffer) { - ret = widget_create_pixmap_object(data); - break; - } - case WIDGET_CONTENT_TYPE_BUFFER: - ret = widget_create_buffer_object(data); - break; - case WIDGET_CONTENT_TYPE_TEXT: - ret = widget_create_text_object(data); - break; - case WIDGET_CONTENT_TYPE_UIFW: - ret = widget_create_plug_object(data); - break; - case WIDGET_CONTENT_TYPE_INVALID: - default: - ret = WIDGET_ERROR_INVALID_PARAMETER; - break; - } - - if (ret == WIDGET_ERROR_NONE) { - info.error = WIDGET_ERROR_NONE; - info.widget_app_id = data->widget_id; - info.event = WIDGET_EVENT_CREATED; - - data->is.field.created = 1; - - update_visibility(data); - smart_callback_call(data, WIDGET_SMART_SIGNAL_WIDGET_CREATED, &info); - DbgPrint("Invoke raw create %s\n", data->widget_id); - (void)invoke_raw_event_callback(WIDGET_VIEWER_EVAS_RAW_CREATE, data->widget_id, data->widget, ret); - - /** - * In case of using the direct update path, - * sometimes the provider can send the updated event faster than created event. - * In that case, the viewer cannot recognize the updated content of a widget. - * So for the safety, I added this to forcely update the widget at the first time - * Right after creating its instance. - */ - append_widget_dirty_object_list(data, WIDGET_KEEP_BUFFER); - - if (data->is.field.extra_info_updated) { - data->is.field.extra_info_updated = 0; - - info.widget_app_id = data->widget_id; - info.event = WIDGET_EVENT_EXTRA_INFO_UPDATED; - info.error = WIDGET_ERROR_NONE; - smart_callback_call(data, WIDGET_SMART_SIGNAL_EXTRA_INFO_UPDATED, &info); - } - } else { - info.error = ret; - info.widget_app_id = data->widget_id; - info.event = WIDGET_EVENT_CREATED; - smart_callback_call(data, WIDGET_SMART_SIGNAL_WIDGET_CREATE_ABORTED, &info); - data->is.field.send_delete = 0; - DbgPrint("Invoke raw delete %s\n", data->widget_id); - (void)invoke_raw_event_callback(WIDGET_VIEWER_EVAS_RAW_DELETE, data->widget_id, data->widget, ret); - } - - widget_unref(data); -} - -static void __widget_resize_image_object(struct widget_data *data) -{ - DbgPrint("widget resize request is succssfully sent\n"); -} - -static void __widget_resize_buffer_object(struct widget_data *data) -{ - DbgPrint("widget resize request is succssfully sent\n"); -} - -static void __widget_resize_text_object(struct widget_data *data) -{ - DbgPrint("widget resize request is succssfully sent\n"); -} - -static void __widget_resize_cb(struct widget *handle, int ret, void *cbdata) -{ - struct widget_data *data = cbdata; - struct widget_evas_event_info info; - widget_type_e widget_type; - - if (data->state != WIDGET_DATA_CREATED) { - ErrPrint("Invalid widget data: %p\n", data); - return; - } - - if (ret != WIDGET_ERROR_NONE) { - info.error = ret; - info.event = WIDGET_EVENT_WIDGET_SIZE_CHANGED; - info.widget_app_id = data->widget_id; - smart_callback_call(data, WIDGET_SMART_SIGNAL_WIDGET_RESIZE_ABORTED, &info); - widget_unref(data); - return; - } - - widget_viewer_get_type(handle, 0, &widget_type); - switch (widget_type) { - case WIDGET_CONTENT_TYPE_IMAGE: - __widget_resize_image_object(data); - break; - case WIDGET_CONTENT_TYPE_RESOURCE_ID: - if (!s_info.conf.field.force_to_buffer) { - __widget_resize_pixmap_object(data); - break; - } - case WIDGET_CONTENT_TYPE_BUFFER: - __widget_resize_buffer_object(data); - break; - case WIDGET_CONTENT_TYPE_TEXT: - __widget_resize_text_object(data); - break; - case WIDGET_CONTENT_TYPE_UIFW: - break; - case WIDGET_CONTENT_TYPE_INVALID: - break; - default: - break; - } - - Evas_Object *scroller; - scroller = elm_object_part_content_get(data->widget_layout, "scroller"); - if (scroller) { - Evas_Object *box; - - box = elm_object_content_get(scroller); - if (box) { - widget_size_type_e type; - - if (widget_viewer_get_size_type(handle, &type) == WIDGET_ERROR_NONE) { - int height; - int width; - - if (widget_service_get_size(type, &width, &height) == WIDGET_ERROR_NONE) { - if (s_info.conf.field.is_scroll_x) { - height <<= 1; - } - - if (s_info.conf.field.is_scroll_y) { - width <<= 1; - } - - DbgPrint("Update scroller size to : %dx%d\n", width, height); - elm_object_content_unset(scroller); - evas_object_resize(box, width, height); - evas_object_size_hint_min_set(box, width, height); - elm_object_content_set(scroller, box); - } - } else { - ErrPrint("Failed to get widget size: %x\n", type); - } - } - } - - info.error = ret; - info.event = WIDGET_EVENT_WIDGET_SIZE_CHANGED; - info.widget_app_id = data->widget_id; - smart_callback_call(data, WIDGET_SMART_SIGNAL_WIDGET_RESIZED, &info); - widget_unref(data); -} - -static void gbar_overlay_disable(struct widget_data *data) -{ - if (!data->gbar_layout) { - return; - } - - if (!data->is.field.gbar_overlay_loaded) { - return; - } - - elm_object_signal_emit(data->gbar_layout, "disable", "overlay"); - data->is.field.gbar_overlay_loaded = 0; -} - -static void gbar_overlay_loading(struct widget_data *data) -{ - Evas_Object *rect; - - if (data->is.field.gbar_overlay_loaded) { - ErrPrint("Already loaded"); - return; - } - - rect = elm_object_part_content_unset(data->gbar_layout, "overlay,content"); - if (rect) { - evas_object_del(rect); - } - - rect = evas_object_rectangle_add(data->e); - evas_object_color_set(rect, 0, 0, 0, 0); - evas_object_show(rect); - /*! - * \todo - * Overlay for loading a GBAR - */ - - elm_object_part_content_set(data->gbar_layout, "overlay,content", rect); - elm_object_signal_emit(data->gbar_layout, "enable", "overlay"); - - data->is.field.gbar_overlay_loaded = 1; -} - -static Evas_Object *widget_load_overlay_edje(struct widget_data *data) -{ - Evas_Object *overlay; - - overlay = elm_layout_add(data->parent); - if (!overlay) { - ErrPrint("Failed to create a overlay\n"); - return NULL; - } - - if (elm_layout_file_set(overlay, WIDGET_VIEWER_EVAS_RESOURCE_EDJ, WIDGET_VIEWER_EVAS_RESOURCE_OVERLAY_LOADING) == EINA_FALSE) { - ErrPrint("Failed to load overlay file\n"); - evas_object_del(overlay); - return NULL; - } - - elm_object_part_content_set(data->widget_layout, "overlay,content", overlay); - return overlay; -} - -static Eina_Bool delayed_overlay_disable_cb(void *_data) -{ - struct widget_data *data = _data; - - if (data->is.field.disabled_overlay_animation) { - elm_object_signal_emit(data->widget_layout, "disable,without,animation", "overlay"); - } else { - elm_object_signal_emit(data->widget_layout, "disable", "overlay"); - } - - data->is.field.widget_overlay_loaded = 0; - data->overlay_update_counter = DEFAULT_OVERLAY_COUNTER; - data->overlay_timer = NULL; - return ECORE_CALLBACK_CANCEL; -} - -static void __widget_overlay_disable(struct widget_data *data, int no_timer, int ignore_update_count) -{ - if (!data->widget_layout) { - return; - } - - if (!data->is.field.widget_overlay_loaded) { - return; - } - - if (ignore_update_count) { - data->overlay_update_counter = 0; - } else { - if (data->is.field.hide_overlay_manually) { - return; - } - } - - /** - * @note - * After the frame update counter reaches to ZERO, - * The overlay will be disabled immediately if the "no_timer" is true(1), - * or it will be disabled after a few milli-seconds later. - * The timer will be fired when it gets the first frame update event. - * And it will start estimating seconds. - * Even after the last frame is updated (by "overlay_update_counter"), - * The timer will be expired after DEFAULT_OVERLAY_WAIT_TIME secs later - * which is started from the first frame update event. - */ - data->overlay_update_counter--; - if (data->overlay_update_counter <= 0) { - if (no_timer) { - if (data->overlay_timer) { - ecore_timer_del(data->overlay_timer); - /** - * @note - * data->overlay_timer will be reset'd to NULL by delayed_overlay_disable_cb(). - */ - } - delayed_overlay_disable_cb(data); - return; - } - } - - if (!no_timer && !data->overlay_timer) { - /** - * @note - * This routine will be executed when the update_counter is greater than 0, - * (means that the frame should be updated more as this count) - */ - data->overlay_timer = ecore_timer_add(DEFAULT_OVERLAY_WAIT_TIME, delayed_overlay_disable_cb, data); - if (!data->overlay_timer) { - ErrPrint("Failed to create a timer\n"); - delayed_overlay_disable_cb(data); - } - } -} - -static void __widget_overlay_loading(struct widget_data *data) -{ - struct acquire_data acquire_data; - Evas_Object *overlay; - - if (data->is.field.disable_loading == 1) { - DbgPrint("Loading overlay is disabled"); - return; - } - - if (data->is.field.widget_overlay_loaded == 1) { - DbgPrint("Overlay is already loaded"); - return; - } - - overlay = elm_object_part_content_get(data->widget_layout, "overlay,content"); - if (!overlay) { - overlay = widget_load_overlay_edje(data); - if (!overlay) { - return; - } - } - - if (!data->is.field.disable_preview) { - char *icon; - - icon = get_package_icon(data); - if (icon) { - Evas_Object *preview; - - preview = elm_object_part_content_get(overlay, "preview"); - if (!preview) { - preview = elm_image_add(overlay); - } - - if (preview) { - elm_image_file_set(preview, icon, NULL); - elm_object_part_content_set(overlay, "preview", preview); - } - - free(icon); - } - - DbgPrint("Set overlay loading (%p) %s\n", data, data->widget_id); - } else { - DbgPrint("Overlay is disabled (%s)\n", data->widget_id); - } - - elm_object_domain_translatable_part_text_set(overlay, "text", PKGNAME, "IDS_ST_BODY_LOADING_ING"); - if (data->is.field.disable_text) { - elm_object_signal_emit(overlay, "disable", "text"); - } - - elm_object_signal_emit(data->widget_layout, "reset", "overlay"); - if (data->is.field.disabled_overlay_animation) { - elm_object_signal_emit(data->widget_layout, "enable,without,animation", "overlay"); - } else { - elm_object_signal_emit(data->widget_layout, "enable", "overlay"); - } - - evas_object_geometry_get(data->widget, NULL, NULL, &acquire_data.w, &acquire_data.h); - acquire_data.content = NULL; - acquire_data.data = data; - update_widget_geometry(&acquire_data); - - data->is.field.widget_overlay_loaded = 1; - data->overlay_update_counter = DEFAULT_OVERLAY_COUNTER; -} - -static void __widget_overlay_faulted(struct widget_data *data) -{ - struct acquire_data acquire_data; - Evas_Object *overlay; - widget_type_e widget_type; - - if (data->is.field.hide_faulted_overlay == 1) { - DbgPrint("Faulted overlay is hidden by request (%s)\n", data->widget_id); - data->is.field.hide_faulted_overlay = 0; - return; - } - - if (data->is.field.widget_overlay_loaded) { - __widget_overlay_disable(data, 1, 1); - } - - overlay = elm_object_part_content_get(data->widget_layout, "overlay,content"); - if (!overlay) { - overlay = widget_load_overlay_edje(data); - if (!overlay) { - return; - } - } - - widget_viewer_get_type(data->handle, 0, &widget_type); - if (widget_type != WIDGET_CONTENT_TYPE_IMAGE) { - Evas_Object *preview; - - preview = elm_object_part_content_get(overlay, "preview"); - if (!preview) { - char *icon; - - icon = get_preview_image(data, data->size_type); - if (icon) { - preview = elm_image_add(data->widget_layout); - if (preview) { - elm_image_file_set(preview, icon, NULL); - elm_object_part_content_set(overlay, "preview", preview); - } - - free(icon); - } - } - } - - DbgPrint("Set overlay fault (%p) %s\n", data, data->widget_id); - elm_object_domain_translatable_part_text_set(overlay, "text", PKGNAME, "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"); - elm_object_signal_emit(overlay, "enable", "text"); - elm_object_signal_emit(data->widget_layout, "reset", "overlay"); - elm_object_signal_emit(data->widget_layout, "enable", "overlay"); - - evas_object_geometry_get(data->widget, NULL, NULL, &acquire_data.w, &acquire_data.h); - acquire_data.content = NULL; - acquire_data.data = data; - update_widget_geometry(&acquire_data); - data->is.field.widget_overlay_loaded = 1; -} - -static void __widget_resize(Evas_Object *widget, Evas_Coord w, Evas_Coord h) -{ - struct widget_data *data; - widget_size_type_e type; - bool need_of_touch_effect = false; - bool need_of_mouse_event = false; - - data = evas_object_smart_data_get(widget); - if (!data) { - ErrPrint("Invalid object\n"); - return; - } - - if (data->state != WIDGET_DATA_CREATED) { - ErrPrint("Invalid widget data: %p\n", data); - return; - } - - type = find_size_type(data, w, h); - if (type == WIDGET_SIZE_TYPE_UNKNOWN) { - ErrPrint("Invalid size: %dx%d\n", w, h); - } else if (s_info.conf.field.use_fixed_size) { - if (widget_service_get_size(type, &w, &h) < 0) { - ErrPrint("Failed to get box size\n"); - } - data->fixed_width = w; - data->fixed_height = h; - } else { - if (widget_service_get_size(type, &data->fixed_width, &data->fixed_height) < 0) { - DbgPrint("Use the given size\n"); - data->fixed_width = w; - data->fixed_width = h; - } else { - ErrPrint("Failed to get box size\n"); - } - } - - /** - * @note - * If the use_fixed_size is false, the size_type can be differ with width & height - * Then we should not try to resize resource_id(surface) as width & height. - * Just keep them their size and try to resize layout only. - */ - if (!widget_viewer_is_created_by_user(data->handle)) { - /** - * Viewer should not be able to resize the box - */ - ErrPrint("System created Widget is not able to be resized (%s)\n", widget_viewer_get_pkgname(data->handle)); - - /* But update its size by handle's size */ - widget_viewer_get_size_type(data->handle, &data->size_type); - - if (data->size_type == WIDGET_SIZE_TYPE_UNKNOWN || widget_service_get_size(data->size_type, &data->widget_width, &data->widget_height)) { - ErrPrint("Unable to get default size from handle\n"); - /* - * In this case, just depends on user's request. - * Because, there is no other information which we can use. - */ - data->size_type = type; - data->widget_width = w; - data->widget_height = h; - } - } else { - data->widget_width = w; - data->widget_height = h; - data->size_type = type; - } - - DbgPrint("Request size change: %dx%d [0x%X]\n", w, h, data->size_type); - - if (data->is.field.faulted) { - evas_object_resize(data->widget_layout, data->widget_width, data->widget_height); - ErrPrint("Faulted widget, skip resizing (%s)\n", data->widget_id); - return; - } - - if (!data->handle) { - struct acquire_data acquire_data = { - .data = data, - }; - - DbgPrint("Create new handle: %dx%d, (%s, %s), %s/%s\n", data->widget_width, data->widget_height, - data->widget_id, data->content, - data->cluster, data->category); - - if (widget_viewer_activate_faulted_widget(data->widget_id, NULL, NULL) < 0) { - ErrPrint("Activate: %s\n", data->widget_id); - } - - data->is.field.created = 0; - data->is.field.send_delete = 1; - update_widget_geometry(&acquire_data); - - data->handle = widget_viewer_add_widget(data->widget_id, data->content, - data->cluster, data->category, - data->period, type, - __widget_created_cb, widget_ref(data)); - if (!data->handle) { - ErrPrint("Failed to send add request\n"); - DbgPrint("Unref %p %s\n", data, data->widget_id); - widget_unref(data); - return; - } - - DbgPrint("Added handle: %p (%p)\n", data->handle, data); - widget_viewer_set_data(data->handle, widget); - __widget_overlay_loading(data); - widget_service_get_need_of_touch_effect(data->widget_id, type, (bool *)&need_of_touch_effect); - data->is.field.touch_effect = need_of_touch_effect; - widget_service_get_need_of_mouse_event(data->widget_id, type, (bool *)&need_of_mouse_event); - data->is.field.mouse_event = need_of_mouse_event; - } else { - - int ret; - - if (type > 0 && type != WIDGET_SIZE_TYPE_UNKNOWN) { - ret = widget_viewer_resize_widget(data->handle, type, __widget_resize_cb, widget_ref(data)); - } else { - ret = WIDGET_ERROR_INVALID_PARAMETER; - /* This will be decreased soon ... */ - widget_ref(data); - } - - evas_object_resize(data->widget_layout, data->widget_width, data->widget_height); - if (ret == WIDGET_ERROR_ALREADY_EXIST) { - DbgPrint("Same size\n"); - widget_unref(data); - } else if (ret == WIDGET_ERROR_NONE) { - DbgPrint("Resize request is successfully sent\n"); - widget_service_get_need_of_touch_effect(data->widget_id, type, (bool *)&need_of_touch_effect); - data->is.field.touch_effect = need_of_touch_effect; - widget_service_get_need_of_mouse_event(data->widget_id, type, (bool *)&need_of_mouse_event); - data->is.field.mouse_event = need_of_mouse_event; - } else { - widget_unref(data); - } - } -} - -static void __widget_show(Evas_Object *widget) -{ - struct widget_data *data; - - data = evas_object_smart_data_get(widget); - if (!data) { - ErrPrint("Invalid object\n"); - return; - } - - if (data->state != WIDGET_DATA_CREATED) { - ErrPrint("Invalid widget data: %p\n", data); - return; - } - - evas_object_show(data->stage); - evas_object_show(data->widget_layout); - - if (!s_info.conf.field.manual_pause_resume) { - update_visibility(data); - } -} - -static void __widget_hide(Evas_Object *widget) -{ - struct widget_data *data; - - data = evas_object_smart_data_get(widget); - if (!data) { - ErrPrint("Invalid object\n"); - return; - } - - if (data->state != WIDGET_DATA_CREATED) { - ErrPrint("Invalid widget data: %p\n", data); - return; - } - - evas_object_hide(data->stage); - evas_object_hide(data->widget_layout); - - if (!s_info.conf.field.manual_pause_resume) { - update_visibility(data); - } -} - -static void __widget_color_set(Evas_Object *widget, int r, int g, int b, int a) -{ - struct widget_data *data; - - data = evas_object_smart_data_get(widget); - if (!data) { - ErrPrint("Invalid object\n"); - return; - } - - if (data->state != WIDGET_DATA_CREATED) { - ErrPrint("Invalid widget data: %p\n", data); - return; - } - - evas_object_color_set(data->stage, r, g, b, a); -} - -static void __widget_clip_set(Evas_Object *widget, Evas_Object *clip) -{ - struct widget_data *data; - - data = evas_object_smart_data_get(widget); - if (!data) { - ErrPrint("Invalid object\n"); - return; - } - - if (data->state != WIDGET_DATA_CREATED) { - ErrPrint("Invalid widget data: %p\n", data); - return; - } - - evas_object_clip_set(data->stage, clip); -} - -static void __widget_clip_unset(Evas_Object *widget) -{ - struct widget_data *data; - - data = evas_object_smart_data_get(widget); - if (!data) { - ErrPrint("Invalid object\n"); - return; - } - - if (data->state != WIDGET_DATA_CREATED) { - ErrPrint("Invalid widget data: %p\n", data); - return; - } - - evas_object_clip_unset(data->stage); -} - -/** - * This must be called before update_gbar_geometry - */ -static void update_stage_geometry(struct acquire_data *acquire_data) -{ - Evas_Coord widget_x, widget_y, widget_w, widget_h; - Evas_Coord stage_w, stage_h; - - evas_object_geometry_get(acquire_data->data->widget_layout, &widget_x, &widget_y, &widget_w, &widget_h); - - const int delta_y_top = (acquire_data->h - widget_y); - const int delta_y_bottom = (acquire_data->h - (s_info.screen_height - widget_y - widget_h)); - - stage_w = widget_w > acquire_data->w ? widget_w : acquire_data->w; - stage_h = widget_h + acquire_data->h;/* - delta_y_top; */ - - if (delta_y_top >= delta_y_bottom) { - evas_object_move(acquire_data->data->stage, 0, widget_y); - } else { - evas_object_move(acquire_data->data->stage, 0, widget_y - acquire_data->h); - } - - evas_object_resize(acquire_data->data->stage, stage_w, stage_h); -} - -static void update_gbar_geometry(struct acquire_data *acquire_data) -{ - Evas_Coord widget_x, widget_y, widget_w, widget_h; - - evas_object_geometry_get(acquire_data->data->widget_layout, &widget_x, &widget_y, &widget_w, &widget_h); - - /* How much of the GBAR is outside the screen */ - const int delta_y_top = (acquire_data->h - widget_y) < 0 ? 0 : acquire_data->h - widget_y; - const int delta_y_bottom = (acquire_data->h - (s_info.screen_height - widget_y - widget_h)) < 0 ? 0 : (acquire_data->h - (s_info.screen_height - widget_y - widget_h)); - - /* If more of the GBAR is outside the top side draw at the bottom, otherwise draw at the top */ - if (delta_y_top >= delta_y_bottom) { - evas_object_move(acquire_data->data->gbar_layout, 0, widget_y + widget_h - delta_y_bottom); - effect_resize(acquire_data->data->gbar_layout, acquire_data->w, acquire_data->h, EFFECT_HEIGHT); - } else { - evas_object_move(acquire_data->data->gbar_layout, 0, widget_y + delta_y_top); - effect_resize(acquire_data->data->gbar_layout, acquire_data->w, acquire_data->h, EFFECT_HEIGHT|EFFECT_MOVE); - } -} - -static void update_widget_geometry(struct acquire_data *acquire_data) -{ - Evas_Coord widget_x, widget_y, widget_w, widget_h; - Evas_Coord stage_w, stage_h; - struct widget_data *data = acquire_data->data; - - evas_object_resize(data->widget_layout, data->widget_width, data->widget_height); - evas_object_geometry_get(data->widget_layout, &widget_x, &widget_y, &widget_w, &widget_h); - - if (data->gbar_layout) { - Evas_Coord gbar_x, gbar_y, gbar_w, gbar_h; - - evas_object_geometry_get(data->gbar_layout, &gbar_x, &gbar_y, &gbar_w, &gbar_h); - if (widget_y + widget_h + gbar_h > s_info.screen_height) { - evas_object_move(data->gbar_layout, 0, widget_y - gbar_h); - evas_object_move(data->stage, 0, widget_y - gbar_h); - } else { - evas_object_move(data->gbar_layout, 0, widget_y + widget_h); - evas_object_move(data->stage, 0, widget_y); - } - - stage_w = gbar_w > widget_w ? gbar_w : widget_w; - stage_h = widget_h + gbar_h; - } else { - stage_w = widget_w; - if (s_info.conf.field.support_gbar) { - stage_h = widget_h + RESEVED_AREA_FOR_GBAR_EFFECT; /* Reserve 100 px for effect */ - } else { - stage_h = widget_h; - } - - evas_object_move(data->stage, widget_x, widget_y); - } - - evas_object_resize(data->stage, stage_w, stage_h); -} - -static void __widget_update_image_object(struct widget_data *data, Evas_Object *widget_content, int w, int h) -{ - Evas_Object *front_image; - - front_image = elm_object_part_content_get(widget_content, "front,content"); - if (front_image) { - elm_image_file_set(front_image, widget_viewer_get_filename(data->handle), NULL); - } else { - ErrPrint("Image object not found\n"); - } -} - -static void __widget_update_buffer_object(struct widget_data *data, Evas_Object *widget_content, int w, int h) -{ - struct acquire_data acquire_data = { - .w = w, - .h = h, - .content = widget_content, - .data = data, - }; - - if (data->widget_fb) { - widget_viewer_release_buffer(data->widget_fb); - data->widget_fb = NULL; - } - - data->widget_fb = widget_viewer_acquire_buffer(data->handle, 0); - if (!data->widget_fb) { - ErrPrint("Failed to get fb\n"); - return; - } - - evas_object_image_size_set(widget_content, w, h); - - if (widget_viewer_acquire_buffer_lock(data->handle, 0) < 0) { - ErrPrint("Failed to acquire lock\n"); - } - evas_object_image_data_copy_set(widget_content, data->widget_fb); - if (widget_viewer_release_buffer_lock(data->handle, 0) < 0) { - ErrPrint("Failed to release lock\n"); - } - - evas_object_image_fill_set(widget_content, 0, 0, w, h); - evas_object_image_pixels_dirty_set(widget_content, EINA_TRUE); - evas_object_image_data_update_add(widget_content, 0, 0, w, h); - update_widget_geometry(&acquire_data); -} - -static void __widget_update_text_object(struct widget_data *data, Evas_Object *widget_content, int w, int h) -{ - struct acquire_data acquire_data = { - .w = w, - .h = h, - .content = widget_content, - .data = data, - }; - - update_widget_geometry(&acquire_data); -} - -static void __widget_event_extra_info_updated(struct widget_data *data) -{ - struct widget_evas_event_info info; - const char *content_info; - char *tmp; - - if (data->is.field.deleted) { - DbgPrint("Box is %s, ignore update\n", data->is.field.deleted ? "deleted" : "faulted"); - return; - } - - content_info = widget_viewer_get_content_string(data->handle); - if (content_info && data->content) { - if (!strcmp(content_info, data->content)) { - /* Nothing chnaged */ - } else { - tmp = strdup(content_info); - if (!tmp) { - ErrPrint("Heap: %d\n", errno); - return; - } - - free(data->content); - data->content = tmp; - } - } else if (content_info) { - tmp = strdup(content_info); - if (!tmp) { - ErrPrint("Heap: %d\n", errno); - return; - } - data->content = tmp; - } else if (data->content) { - free(data->content); - data->content = NULL; - } else { - /* Nothing changed */ - } - - if (data->is.field.created == 0) { - DbgPrint("Extra info is updated[%s]\n", data->widget_id); - data->is.field.extra_info_updated = 1; - } else { - info.widget_app_id = data->widget_id; - info.event = WIDGET_EVENT_EXTRA_INFO_UPDATED; - info.error = WIDGET_ERROR_NONE; - smart_callback_call(data, WIDGET_SMART_SIGNAL_EXTRA_INFO_UPDATED, &info); - } -} - -/*! - * Event handlers - */ -static void __widget_event_widget_updated(struct widget_data *data) -{ - Evas_Object *content; - widget_size_type_e type; - widget_type_e widget_type; - int w, h; - struct widget_evas_event_info info; - - data->is.field.widget_dirty = 0; - - if (data->is.field.deleted) { - DbgPrint("Box is %s, ignore update\n", data->is.field.deleted ? "deleted" : "faulted"); - return; - } - - content = elm_object_part_content_get(data->widget_layout, "widget,content"); - if (!content) { - ErrPrint("Failed to get content object\n"); - return; - } - - widget_viewer_get_size_type(data->handle, &type); - if (type < 0 || type == WIDGET_SIZE_TYPE_UNKNOWN) { - ErrPrint("Size is not valid %X\n", type); - return; - } - - /** - * @note - * We should not use this widget_width and widget_height - * It is set'd by user but the resource_id buffer should be resized by size_type. - * Even if the script or text or image can be resized to given size,. - * We should handles them as resource_id to make the consistent behaviour. - */ - widget_service_get_size(type, &w, &h); - if (w != data->widget_width || h != data->widget_height) { - DbgPrint("Pixel and Type are differ. use type [%dx%d] - [%dx%d]\n", w, h, data->widget_width, data->widget_height); - } - - widget_viewer_get_type(data->handle, 0, &widget_type); - - switch (widget_type) { - case WIDGET_CONTENT_TYPE_IMAGE: - __widget_update_image_object(data, content, w, h); - __widget_overlay_disable(data, 0, 0); - break; - case WIDGET_CONTENT_TYPE_RESOURCE_ID: - if (!s_info.conf.field.force_to_buffer) { - __widget_update_pixmap_object(data, content, w, h); - break; - } - case WIDGET_CONTENT_TYPE_BUFFER: - __widget_update_buffer_object(data, content, w, h); - __widget_overlay_disable(data, 0, 0); - break; - case WIDGET_CONTENT_TYPE_TEXT: - __widget_update_text_object(data, content, w, h); - __widget_overlay_disable(data, 0, 0); - break; - case WIDGET_CONTENT_TYPE_UIFW: - break; - case WIDGET_CONTENT_TYPE_INVALID: - default: - break; - } - - info.widget_app_id = data->widget_id; - info.event = WIDGET_EVENT_WIDGET_UPDATED; - info.error = WIDGET_ERROR_NONE; - smart_callback_call(data, WIDGET_SMART_SIGNAL_UPDATED, &info); -} - -static void gbar_update_buffer_object(struct widget_data *data, Evas_Object *gbar_content, int w, int h) -{ - struct acquire_data acquire_data = { - .data = data, - .content = gbar_content, - .w = w, - .h = h, - }; - - if (data->gbar_fb) { - widget_viewer_release_buffer(data->gbar_fb); - data->gbar_fb = NULL; - } else { - /* This is first time */ - gbar_overlay_disable(data); - } - - data->gbar_fb = widget_viewer_acquire_buffer(data->handle, 1); - if (!data->gbar_fb) { - ErrPrint("Failed to get fb\n"); - return; - } - - evas_object_image_size_set(gbar_content, w, h); - - if (widget_viewer_acquire_buffer_lock(data->handle, 1) < 0) { - ErrPrint("Failed to acquire lock\n"); - } - evas_object_image_data_copy_set(gbar_content, data->gbar_fb); - if (widget_viewer_release_buffer_lock(data->handle, 1) < 0) { - ErrPrint("Failed to release lock\n"); - } - - evas_object_image_fill_set(gbar_content, 0, 0, w, h); - evas_object_image_pixels_dirty_set(gbar_content, EINA_TRUE); - evas_object_image_data_update_add(gbar_content, 0, 0, w, h); - - update_stage_geometry(&acquire_data); - update_gbar_geometry(&acquire_data); -} - -static void gbar_update_text_object(struct widget_data *data, Evas_Object *gbar_content, int w, int h) -{ - struct acquire_data acquire_data = { - .data = data, - .content = gbar_content, - .w = w, - .h = h, - }; - - ErrPrint("Text type is updated\n"); - gbar_overlay_disable(data); - - update_stage_geometry(&acquire_data); - update_gbar_geometry(&acquire_data); -} - -static void update_gbar_pixmap(Evas_Object *content, int w, int h) -{ - evas_object_image_pixels_dirty_set(content, EINA_TRUE); - evas_object_image_data_update_add(content, 0, 0, w, h); - evas_object_show(content); -} - -static void acquire_gbar_pixmap_cb(struct widget *handle, int pixmap, void *cbdata) -{ - struct acquire_data *acquire_data = cbdata; - struct widget_data *data = acquire_data->data; - - data->is.field.gbar_pixmap_acquire_requested = 0; - - if (pixmap == 0) { - ErrPrint("Failed to acquire pixmap\n"); - DbgPrint("Unref %p %s\n", data, data->widget_id); - widget_unref(data); - if (!s_info.conf.field.skip_acquire) { - free(acquire_data); - } - return; - } - - evas_object_image_size_set(acquire_data->content, acquire_data->w, acquire_data->h); - evas_object_image_fill_set(acquire_data->content, 0, 0, acquire_data->w, acquire_data->h); - - /** - * 1 means, First time. - */ - if (util_set_native_surface(handle, 1, acquire_data->content, (unsigned int)pixmap, s_info.conf.field.skip_acquire) == 1) { - gbar_overlay_disable(data); - } - - data->gbar_pixmap = (unsigned int)pixmap; - - append_gbar_dirty_object_list(data, WIDGET_KEEP_BUFFER); - update_stage_geometry(acquire_data); - update_gbar_geometry(acquire_data); - - if (!s_info.conf.field.skip_acquire) { - free(acquire_data); - } - DbgPrint("Unref %p %s\n", data, data->widget_id); - widget_unref(data); -} - -static void gbar_update_pixmap_object(struct widget_data *data, Evas_Object *gbar_content, int w, int h) -{ - struct acquire_data *acquire_data; - int ret; - unsigned int resource_id; - - if (data->gbar_latest_idx == WIDGET_PRIMARY_BUFFER) { - widget_viewer_get_resource_id(data->handle, 1, &resource_id); - if (data->gbar_pixmap == resource_id) { - int ow; - int oh; - - effect_size_get(gbar_content, &ow, &oh); - - if (data->gbar_extra) { - replace_pixmap(NULL, 1, gbar_content, data->gbar_pixmap); - } - update_gbar_pixmap(gbar_content, w, h); - - if (ow != w || oh != h) { - struct acquire_data adata = { - .data = data, - .content = gbar_content, - .w = w, - .h = h, - }; - - update_stage_geometry(&adata); - } - return; - } - - if (s_info.conf.field.skip_acquire && resource_id != 0) { - struct acquire_data local_acquire_data = { - .data = widget_ref(data), - .content = gbar_content, - .w = w, - .h = h, - }; - - acquire_gbar_pixmap_cb(data->handle, resource_id, &local_acquire_data); - return; - } - - if (data->is.field.gbar_pixmap_acquire_requested) { - return; - } - - acquire_data = malloc(sizeof(*acquire_data)); - if (!acquire_data) { - ErrPrint("Heap: %d\n", errno); - return; - } - - acquire_data->content = gbar_content; - acquire_data->w = w; - acquire_data->h = h; - acquire_data->data = widget_ref(data); - - ret = widget_viewer_acquire_resource_id(data->handle, 1, acquire_gbar_pixmap_cb, acquire_data); - if (ret != WIDGET_ERROR_NONE) { - ErrPrint("Failed to acquire gbar resource id\n"); - free(acquire_data); - DbgPrint("Unref %p %s\n", data, data->widget_id); - widget_unref(data); - } else { - data->is.field.gbar_pixmap_acquire_requested = 1; - } - } else { - int ow; - int oh; - - if (!data->gbar_extra) { - DbgPrint("Extra GBar is not prepared yet\n"); - return; - } - - effect_size_get(gbar_content, &ow, &oh); - - replace_pixmap(NULL, 1, gbar_content, data->gbar_extra[data->gbar_latest_idx]); - update_gbar_pixmap(gbar_content, w, h); - - if (ow != w || oh != h) { - struct acquire_data adata = { - .data = data, - .content = gbar_content, - .w = w, - .h = h, - }; - - update_stage_geometry(&adata); - } - } -} - -static void __widget_event_gbar_updated(struct widget_data *data) -{ - Evas_Object *gbar_content; - int w, h; - widget_type_e widget_type; - - data->is.field.gbar_dirty = 0; - - if (data->is.field.deleted) { - DbgPrint("Box is deleted, ignore update\n"); - return; - } - - gbar_content = elm_object_part_content_get(data->gbar_layout, "gbar,content"); - if (!gbar_content) { - ErrPrint("Failed to get content object\n"); - return; - } - - if (widget_viewer_get_glance_bar_size(data->handle, &w, &h) != WIDGET_ERROR_NONE) { - ErrPrint("Failed to get gbar_size\n"); - w = 0; - h = 0; - } - - widget_viewer_get_type(data->handle, 1, &widget_type); - - switch (widget_type) { - case WIDGET_CONTENT_TYPE_RESOURCE_ID: - if (!s_info.conf.field.force_to_buffer) { - gbar_update_pixmap_object(data, gbar_content, w, h); - break; - } - case WIDGET_CONTENT_TYPE_BUFFER: - gbar_update_buffer_object(data, gbar_content, w, h); - break; - case WIDGET_CONTENT_TYPE_TEXT: - gbar_update_text_object(data, gbar_content, w, h); - break; - case WIDGET_CONTENT_TYPE_UIFW: - break; - case WIDGET_CONTENT_TYPE_INVALID: - default: - ErrPrint("Invalid pd type\n"); - break; - } -} - -static void __widget_event_deleted(struct widget_data *data) -{ - struct widget_evas_event_info info; - - if (data->widget_fb) { - widget_viewer_release_buffer(data->widget_fb); - data->widget_fb = NULL; - } - - if (data->gbar_fb) { - widget_viewer_release_buffer(data->gbar_fb); - data->gbar_fb = NULL; - } - - if (data->widget_pixmap) { - replace_widget_pixmap_with_image(data); - } - - if (data->gbar_pixmap) { - replace_gbar_pixmap_with_image(data); - } - - DbgPrint("widget is deleted: %p (emit signal)\n", data); - data->is.field.send_delete = 0; - info.widget_app_id = data->widget_id; - info.event = WIDGET_EVENT_DELETED; - info.error = data->is.field.faulted ? WIDGET_ERROR_FAULT : WIDGET_ERROR_NONE; - - /** - * Even if the widget object tries to be deleted from WIDGET_DELETED event callback, - * widget data should not be released while processing RAW_DELETE event handling - */ - widget_ref(data); - - smart_callback_call(data, WIDGET_SMART_SIGNAL_WIDGET_DELETED, &info); - DbgPrint("Invoke raw delete %s\n", data->widget_id); - (void)invoke_raw_event_callback(WIDGET_VIEWER_EVAS_RAW_DELETE, data->widget_id, data->widget, info.error); - - remove_widget_dirty_object_list(data); - remove_gbar_dirty_object_list(data); /* For the safety */ - - data->handle = NULL; - - /** - * All event handler is handled correctly, - * Then decrease the refcnt of it. - */ - widget_unref(data); -} - -static void __widget_event_request_close_gbar(struct widget_data *data) -{ - int ret; - - ret = widget_viewer_destroy_glance_bar(data->handle, __widget_destroy_gbar_cb, widget_ref(data)); - if (ret < 0) { - ErrPrint("Failed to close a GBAR: %x\n", ret); - DbgPrint("Unref %p %s\n", data, data->widget_id); - widget_unref(data); - } -} - -static void __widget_event_group_changed(struct widget_data *data) -{ - DbgPrint("Group is changed\n"); -} - -static void __widget_event_pinup_changed(struct widget_data *data) -{ - DbgPrint("Pinup is changed\n"); -} - -static void __widget_event_period_changed(struct widget_data *data) -{ - struct widget_evas_event_info info; - - widget_viewer_get_period(data->handle, &(data->period)); - DbgPrint("Update period is changed to (%lf)\n", data->period); - - info.widget_app_id = data->widget_id; - info.event = WIDGET_EVENT_PERIOD_CHANGED; - info.error = WIDGET_ERROR_NONE; - smart_callback_call(data, WIDGET_SMART_SIGNAL_PERIOD_CHANGED, &info); -} - -static void __widget_event_widget_size_changed(struct widget_data *data) -{ - DbgPrint("widget LB size is changed\n"); -} - -static void __widget_event_gbar_size_changed(struct widget_data *data) -{ - DbgPrint("widget GBAR size is changed\n"); -} - -static void __widget_event_gbar_created(struct widget_data *data) -{ - DbgPrint("widget GBAR is created\n"); -} - -static void __widget_event_gbar_destroyed(struct widget_data *data) -{ - DbgPrint("widget GBAR is destroyed\n"); - remove_gbar_dirty_object_list(data); -} - -static void __widget_event_hold_scroll(struct widget_data *data) -{ - struct widget_evas_event_info info; - DbgPrint("widget hold scroll\n"); - - info.widget_app_id = data->widget_id; - info.event = WIDGET_EVENT_HOLD_SCROLL; - info.error = WIDGET_ERROR_NONE; - smart_callback_call(data, WIDGET_SMART_SIGNAL_CONTROL_SCROLLER, &info); -} - -static void __widget_event_release_scroll(struct widget_data *data) -{ - struct widget_evas_event_info info; - DbgPrint("widget release scroll\n"); - - info.widget_app_id = data->widget_id; - info.event = WIDGET_EVENT_RELEASE_SCROLL; - info.error = WIDGET_ERROR_NONE; - smart_callback_call(data, WIDGET_SMART_SIGNAL_CONTROL_SCROLLER, &info); -} - -static void __widget_event_widget_update_begin(struct widget_data *data) -{ - DbgPrint("WIDGET Update Begin\n"); -} - -static void __widget_event_widget_update_end(struct widget_data *data) -{ - DbgPrint("WIDGET Update End\n"); -} - -static void __widget_event_gbar_update_begin(struct widget_data *data) -{ - DbgPrint("GBAR Update Begin\n"); -} - -static void __widget_event_gbar_update_end(struct widget_data *data) -{ - DbgPrint("GBAR Update End\n"); -} - -static void __widget_event_update_mode_changed(struct widget_data *data) -{ - DbgPrint("Update mode changed\n"); -} - -static void __widget_event_ignored(struct widget_data *data) -{ - DbgPrint("Request is ignored\n"); -} - -static Evas_Object *create_widget_object(struct widget *handle) -{ - struct widget_data *data; - const char *cluster; - const char *sub_cluster; - Evas_Object *widget; - double period; - - if (widget_viewer_get_group(handle, &cluster, &sub_cluster) != WIDGET_ERROR_NONE) { - ErrPrint("Unable to get the group info\n"); - } - - /** - * \TODO: Create a widget evas object - */ - - widget_viewer_get_period(handle, &period); - - widget = widget_viewer_evas_add_widget(s_info.win, - widget_viewer_get_pkgname(handle), widget_viewer_get_content_string(handle), - period); - - data = evas_object_smart_data_get(widget); - if (data) { - widget_size_type_e type; - int w = 0; - int h = 0; - - data->handle = handle; - - widget_viewer_get_size_type(handle, &type); - widget_service_get_size(type, &w, &h); - DbgPrint("Size: %dx%d\n", w, h); - evas_object_resize(widget, w, h); - } - - return widget; -} - -static inline int handle_subscribed_group(struct widget *handle) -{ - const char *cluster = NULL; - const char *sub_cluster = NULL; - Eina_List *l; - struct subscribe_group *group; - - if (widget_viewer_get_group(handle, &cluster, &sub_cluster) != WIDGET_ERROR_NONE) { - return WIDGET_ERROR_FAULT; - } - - if (!cluster || !sub_cluster) { - return WIDGET_ERROR_INVALID_PARAMETER; - } - - EINA_LIST_FOREACH(s_info.subscribed_group_list, l, group) { - if (!strcasecmp(group->cluster, cluster) && !strcasecmp(group->sub_cluster, sub_cluster)) { - int nr; - Evas_Object *widget; - struct widget_data *temp_widget_data = NULL; - - DbgPrint("Subscribed Group: (%s)(%s)\n", cluster, sub_cluster); - - /* Subscribed object, Create this */ - widget = create_widget_object(handle); - if (!widget) { - ErrPrint("Failed to create a widget object\n"); - (void)widget_viewer_delete_widget(handle, WIDGET_DELETE_PERMANENTLY, NULL, NULL); - return WIDGET_ERROR_FAULT; - } - - widget_viewer_set_data(handle, widget); - - /* Emit RAW_CREATE event */ - nr = invoke_raw_event_callback(WIDGET_VIEWER_EVAS_RAW_CREATE, widget_viewer_get_pkgname(handle), widget, WIDGET_ERROR_NONE); - - if ((temp_widget_data = get_smart_data(widget)) == NULL) { - ErrPrint("Failed to get widget data\n"); - (void)widget_viewer_delete_widget(handle, WIDGET_DELETE_PERMANENTLY, NULL, NULL); - return WIDGET_ERROR_FAULT; - } - - if (nr <= 0 || widget_system_created(handle, temp_widget_data) != WIDGET_ERROR_NONE) { - /* - * Deleting evas object will invoke delete callback. - * Then it will invoke the RAW_DELETE event and execute the proper procedures for deleting object - */ - widget_viewer_evas_set_permanent_delete(widget, EINA_TRUE); - evas_object_del(widget); - } - - return WIDGET_ERROR_NONE; - } - } - - return WIDGET_ERROR_NOT_EXIST; -} - -static inline int handle_subscribed_category(struct widget *handle) -{ - char *category; - Eina_List *l; - struct subscribe_category *info; - - category = widget_service_get_category(widget_viewer_get_pkgname(handle)); - if (!category) { - return WIDGET_ERROR_INVALID_PARAMETER; - } - - EINA_LIST_FOREACH(s_info.subscribed_category_list, l, info) { - if (!strcmp(category, info->category)) { - int nr; - Evas_Object *widget; - struct widget_data *temp_widget_data; - - DbgPrint("Subscribed Category: (%s)(%s)\n", category, info->category); - - widget = create_widget_object(handle); - if (!widget) { - ErrPrint("Failed to create a widget object\n"); - (void)widget_viewer_delete_widget(handle, WIDGET_DELETE_PERMANENTLY, NULL, NULL); - free(category); - return WIDGET_ERROR_FAULT; - } - - widget_viewer_set_data(handle, widget); - - /* Subscribed object, Create this */ - nr = invoke_raw_event_callback(WIDGET_VIEWER_EVAS_RAW_CREATE, widget_viewer_get_pkgname(handle), widget, WIDGET_ERROR_NONE); - - temp_widget_data = get_smart_data(widget); - if (!temp_widget_data) { - ErrPrint("Failed to get widget data\n"); - (void)widget_viewer_delete_widget(handle, WIDGET_DELETE_PERMANENTLY, NULL, NULL); - evas_object_del(widget); - free(category); - return WIDGET_ERROR_FAULT; - } - - if (nr <= 0 || widget_system_created(handle, temp_widget_data) != WIDGET_ERROR_NONE) { - /* Delete widget, if no one cares it */ - DbgPrint("No one cares\n"); - widget_viewer_evas_set_permanent_delete(widget, EINA_TRUE); - evas_object_del(widget); - } - - free(category); - return WIDGET_ERROR_NONE; - } - } - - free(category); - return WIDGET_ERROR_NOT_EXIST; -} - -static int widget_event_handler(struct widget *handle, enum widget_event_type event, void *cbdata) -{ - Evas_Object *widget; - struct widget_data *data; - int idx; - unsigned int resource_id; - int status; - - widget = widget_viewer_get_data(handle); - if (widget) { - data = get_smart_data(widget); - } else { - data = NULL; - DbgPrint("widget Object is not exists, create it?\n"); - } - - if (!widget || !data || data->is.field.deleted) { - widget_viewer_set_data(handle, NULL); - - if (event == WIDGET_EVENT_CREATED) { - if (handle_subscribed_group(handle) == WIDGET_ERROR_NONE) { - return 0; - } - - if (handle_subscribed_category(handle) == WIDGET_ERROR_NONE) { - return 0; - } - - DbgPrint("System created widget is not supported\n"); - (void)widget_viewer_delete_widget(handle, WIDGET_DELETE_PERMANENTLY, NULL, NULL); - } else { - ErrPrint("Failed to get smart data\n"); - } - - return 0; - } - - switch ((int)event) { - case WIDGET_EVENT_WIDGET_EXTRA_BUFFER_CREATED: - widget_viewer_get_affected_extra_buffer(handle, 0, &idx, &resource_id); - DbgPrint("Extra buffer created for WIDGET: %d (%u)\n", idx, resource_id); - - status = widget_viewer_acquire_extra_resource_id(handle, 0, idx, acquire_widget_extra_resource_cb, data); - if (status < 0) { - ErrPrint("Failed to acquire resource: %u (0x%X)\n", resource_id, status); - break; - } - - if (!data->widget_extra) { - data->widget_extra = calloc(widget_viewer_get_option(WIDGET_OPTION_EXTRA_BUFFER_CNT), sizeof(*data->widget_extra)); - if (!data->widget_extra) { - ErrPrint("calloc: %d\n", errno); - break; - } - } - - data->widget_extra[idx] = resource_id; - data->widget_extra_cnt++; - break; - case WIDGET_EVENT_WIDGET_EXTRA_BUFFER_DESTROYED: - widget_viewer_get_affected_extra_buffer(handle, 0, &idx, &resource_id); - DbgPrint("Extra buffer destroyed for WIDGET: %d (%u)\n", idx, resource_id); - if (data->widget_extra[idx] != resource_id) { - DbgPrint("Resource Id mismatched\n"); - if (data->widget_extra[idx] == 0u) { - DbgPrint("Not acquired resourced\n"); - break; - } - } - - data->widget_extra[idx] = 0u; - data->widget_extra_cnt--; - if (!data->widget_extra_cnt) { - DbgPrint("Release widget array\n"); - free(data->widget_extra); - data->widget_extra = NULL; - } - - if (!s_info.conf.field.skip_acquire) { - if (widget_viewer_release_resource_id(handle, 0, resource_id) < 0) { - ErrPrint("Failed to release resource: %u\n", resource_id); - } - } - break; - case WIDGET_EVENT_GBAR_EXTRA_BUFFER_CREATED: - widget_viewer_get_affected_extra_buffer(handle, 1, &idx, &resource_id); - DbgPrint("Extra buffer destroyed for GBAR: %d (%u)\n", idx, resource_id); - if (!data->gbar_extra) { - data->gbar_extra = calloc(widget_viewer_get_option(WIDGET_OPTION_EXTRA_BUFFER_CNT), sizeof(*data->gbar_extra)); - if (!data->gbar_extra) { - ErrPrint("calloc: %d\n", errno); - break; - } - } - - data->gbar_extra[idx] = resource_id; - data->gbar_extra_cnt++; - - if (widget_viewer_acquire_extra_resource_id(handle, 1, idx, acquire_gbar_extra_resource_cb, data) < 0) { - ErrPrint("Failed to acquire resource: %u\n", resource_id); - } - break; - case WIDGET_EVENT_GBAR_EXTRA_BUFFER_DESTROYED: - widget_viewer_get_affected_extra_buffer(handle, 1, &idx, &resource_id); - DbgPrint("Extra buffer destroyed for GBAR: %d (%u)\n", idx, resource_id); - if (data->gbar_extra[idx] != resource_id) { - DbgPrint("Resource Id mismatched\n"); - } - data->gbar_extra[idx] = 0u; - data->gbar_extra_cnt--; - if (!data->gbar_extra_cnt) { - DbgPrint("Release gbar array\n"); - free(data->gbar_extra); - data->gbar_extra = NULL; - } - - if (!s_info.conf.field.skip_acquire) { - if (widget_viewer_release_resource_id(handle, 1, resource_id) < 0) { - ErrPrint("Failed to release resource: %u\n", resource_id); - } - } - break; - case WIDGET_EVENT_WIDGET_EXTRA_UPDATED: - widget_viewer_get_affected_extra_buffer(handle, 0, &idx, &resource_id); - if (!data->widget_extra) { - ErrPrint("Extra buffer is not prepared yet\n"); - } else { - if (data->widget_extra[idx] != resource_id) { - ErrPrint("Resource ID mismatched\n"); - } - append_widget_dirty_object_list(data, idx); - } - break; - case WIDGET_EVENT_GBAR_EXTRA_UPDATED: - widget_viewer_get_affected_extra_buffer(handle, 1, &idx, &resource_id); - if (!data->gbar_extra) { - ErrPrint("Extra buffer is not prepared yet\n"); - } else { - if (data->gbar_extra[idx] != resource_id) { - ErrPrint("Resource ID mismatched\n"); - } - append_gbar_dirty_object_list(data, idx); - } - break; - case WIDGET_EVENT_WIDGET_UPDATED: - append_widget_dirty_object_list(data, WIDGET_PRIMARY_BUFFER); - break; - case WIDGET_EVENT_GBAR_UPDATED: - append_gbar_dirty_object_list(data, WIDGET_PRIMARY_BUFFER); - break; - case WIDGET_EVENT_EXTRA_INFO_UPDATED: - __widget_event_extra_info_updated(data); - break; - - case WIDGET_EVENT_DELETED: - __widget_event_deleted(data); - break; - - case WIDGET_EVENT_GROUP_CHANGED: - __widget_event_group_changed(data); - break; - case WIDGET_EVENT_PINUP_CHANGED: - __widget_event_pinup_changed(data); - break; - case WIDGET_EVENT_PERIOD_CHANGED: - __widget_event_period_changed(data); - break; - - case WIDGET_EVENT_WIDGET_SIZE_CHANGED: - __widget_event_widget_size_changed(data); - break; - case WIDGET_EVENT_GBAR_SIZE_CHANGED: - __widget_event_gbar_size_changed(data); - break; - - case WIDGET_EVENT_GBAR_CREATED: - __widget_event_gbar_created(data); - break; - case WIDGET_EVENT_GBAR_DESTROYED: - __widget_event_gbar_destroyed(data); - break; - - case WIDGET_EVENT_HOLD_SCROLL: - __widget_event_hold_scroll(data); - break; - case WIDGET_EVENT_RELEASE_SCROLL: - __widget_event_release_scroll(data); - break; - - case WIDGET_EVENT_WIDGET_UPDATE_BEGIN: - __widget_event_widget_update_begin(data); - break; - case WIDGET_EVENT_WIDGET_UPDATE_END: - __widget_event_widget_update_end(data); - break; - - case WIDGET_EVENT_GBAR_UPDATE_BEGIN: - __widget_event_gbar_update_begin(data); - break; - case WIDGET_EVENT_GBAR_UPDATE_END: - __widget_event_gbar_update_end(data); - break; - - case WIDGET_EVENT_UPDATE_MODE_CHANGED: - __widget_event_update_mode_changed(data); - break; - - case WIDGET_EVENT_REQUEST_CLOSE_GBAR: - __widget_event_request_close_gbar(data); - break; - - case WIDGET_EVENT_IGNORED: - __widget_event_ignored(data); - break; - default: - break; - } - - return 0; -} - -static int widget_fault_handler(enum widget_fault_type fault, const char *pkgname, const char *filename, const char *funcname, void *cbdata) -{ - Eina_List *l = NULL; - Evas_Object *widget; - struct widget_data *data; - struct widget_evas_event_info info; - - switch (fault) { - case WIDGET_FAULT_DEACTIVATED: - EINA_LIST_FOREACH(s_info.list, l, widget) { - data = get_smart_data(widget); - if (!data) { - continue; - } - - if (!strcmp(data->widget_id, pkgname)) { - DbgPrint("Faulted: %s (%p)\n", pkgname, data); - data->is.field.faulted = 1; - - info.error = WIDGET_ERROR_FAULT; - info.widget_app_id = data->widget_id; - info.event = WIDGET_FAULT_DEACTIVATED; - - smart_callback_call(data, WIDGET_SMART_SIGNAL_WIDGET_FAULTED, &info); - - __widget_overlay_faulted(data); - } - } - break; - case WIDGET_FAULT_PROVIDER_DISCONNECTED: - EINA_LIST_FOREACH(s_info.list, l, widget) { - data = get_smart_data(widget); - if (!data) { - continue; - } - - if (!strcmp(data->widget_id, pkgname)) { - DbgPrint("Disconnected: %s (%p)\n", pkgname, data); - data->is.field.faulted = 1; - - info.error = WIDGET_ERROR_FAULT; - info.widget_app_id = data->widget_id; - info.event = WIDGET_FAULT_PROVIDER_DISCONNECTED; - - smart_callback_call(data, WIDGET_SMART_SIGNAL_PROVIDER_DISCONNECTED, &info); - - __widget_overlay_faulted(data); - } - } - break; - default: - break; - } - return 0; -} - -static void evas_render_post_cb(void *data, Evas *e, void *event_info) -{ - widget_resource_lock_t handle; - - EINA_LIST_FREE(s_info.updated_pixmap_lock_list, handle) { - widget_service_release_resource_lock(handle); - widget_service_destroy_resource_lock(handle, 0); - } -} - -static void evas_render_pre_cb(void *data, Evas *e, void *event_info) -{ - widget_resource_lock_t handle; - void *pixmap; - - EINA_LIST_FREE(s_info.updated_pixmap_list, pixmap) { - handle = widget_service_create_resource_lock((unsigned int)(PTR_TYPE(pixmap)), WIDGET_LOCK_READ); - if (handle) { - widget_service_acquire_resource_lock(handle); - s_info.updated_pixmap_lock_list = eina_list_append(s_info.updated_pixmap_lock_list, handle); - } else { - ErrPrint("Failed to create a resource lock\n"); - } - } -} - -EAPI int widget_viewer_evas_init(Evas_Object *win) -{ - int ret; - - if (!is_widget_feature_enabled()) { - return WIDGET_ERROR_NOT_SUPPORTED; - } - - if (!win) { - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (s_info.initialized) { - ErrPrint("Already initialized\n"); - return WIDGET_ERROR_ALREADY_EXIST; - } - - if (!bindtextdomain(PKGNAME, WIDGET_EVAS_RESOURCE_PO)) { - ErrPrint("bindtextdomain: %d\n", errno); - } else { - DbgPrint("%s - %s\n", PKGNAME, WIDGET_EVAS_RESOURCE_PO); - } - - util_screen_size_get(&s_info.screen_width, &s_info.screen_height); - - s_info.conf.field.render_animator = 0; /* By default, use render animator for updating */ - - ret = widget_viewer_init(util_display_get(), 1, 0.001f, 1); - if (ret < 0) { - return ret; - } - - ret = widget_viewer_add_event_handler(widget_event_handler, NULL); - if (ret != WIDGET_ERROR_NONE) { - ErrPrint("Failed to set handler\n"); - widget_viewer_fini(); - } else { - DbgPrint("Event handler registered\n"); - ret = widget_viewer_add_fault_handler(widget_fault_handler, NULL); - if (ret != WIDGET_ERROR_NONE) { - ErrPrint("Failed to set fault handler\n"); - widget_viewer_remove_event_handler(widget_event_handler); - widget_viewer_fini(); - } else { - DbgPrint("Fault handler is registered\n"); - s_info.initialized = 1; - widget_conf_init(); - widget_conf_load(); - } - } - - /* s_info.conf.field.force_to_buffer = force_to_buffer; */ - s_info.conf.field.force_to_buffer = 0; - s_info.win = win; - - if (WIDGET_CONF_ENABLE_RESOURCE_LOCK) { - Evas *e; - e = evas_object_evas_get(win); - if (e) { - evas_event_callback_add(e, EVAS_CALLBACK_RENDER_PRE, evas_render_pre_cb, NULL); - evas_event_callback_add(e, EVAS_CALLBACK_RENDER_POST, evas_render_post_cb, NULL); - } - } - - return ret; -} - -EAPI int widget_viewer_evas_fini(void) -{ - int ret; - - if (!is_widget_feature_enabled()) { - return WIDGET_ERROR_NOT_SUPPORTED; - } - - if (s_info.initialized) { - if (WIDGET_CONF_ENABLE_RESOURCE_LOCK && s_info.win) { - Evas *e; - e = evas_object_evas_get(s_info.win); - if (e) { - evas_event_callback_del(e, EVAS_CALLBACK_RENDER_PRE, evas_render_pre_cb); - evas_event_callback_del(e, EVAS_CALLBACK_RENDER_POST, evas_render_post_cb); - } - } - - widget_viewer_remove_event_handler(widget_event_handler); - widget_viewer_remove_fault_handler(widget_fault_handler); - widget_viewer_fini(); - widget_conf_reset(); - s_info.initialized = 0; - - ret = WIDGET_ERROR_NONE; - } else { - ret = WIDGET_ERROR_FAULT; - } - - return ret; -} - -EAPI int widget_viewer_evas_notify_resumed_status_of_viewer(void) -{ - if (!is_widget_feature_enabled()) { - return WIDGET_ERROR_NOT_SUPPORTED; - } - - if (!s_info.initialized) { - return WIDGET_ERROR_FAULT; - } - - return widget_viewer_notify_resumed_status_of_viewer(); -} - -EAPI int widget_viewer_evas_notify_paused_status_of_viewer(void) -{ - if (!is_widget_feature_enabled()) { - return WIDGET_ERROR_NOT_SUPPORTED; - } - - if (!s_info.initialized) { - return WIDGET_ERROR_FAULT; - } - - return widget_viewer_notify_paused_status_of_viewer(); -} - -EAPI int widget_viewer_evas_notify_orientation_of_viewer(int orientation) -{ - if (!is_widget_feature_enabled()) { - return WIDGET_ERROR_NOT_SUPPORTED; - } - - if (!s_info.initialized) { - return WIDGET_ERROR_FAULT; - } - - return widget_viewer_notify_orientation_of_viewer(orientation); -} - -EAPI Evas_Object *widget_viewer_evas_add_widget(Evas_Object *parent, const char *widget_id, const char *content_info, double period) -{ - struct widget_data *data; - Evas_Object *widget; - char *_widget_id; - char *_content_info; - char *_cluster; - char *_category; - char *cluster = DEFAULT_CLUSTER; - char *category = DEFAULT_CATEGORY; - - if (!is_widget_feature_enabled()) { - return NULL; - } - - if (!s_info.initialized) { - ErrPrint("Viewer is not initialized\n"); - return NULL; - } - - if (!parent || !widget_id) { - return NULL; - } - - _cluster = strdup(cluster); - if (!_cluster) { - ErrPrint("Heap: %d\n", errno); - return NULL; - } - - _category = strdup(category); - if (!_category) { - ErrPrint("Heap: %d\n", errno); - free(_cluster); - return NULL; - } - - _widget_id = strdup(widget_id); - if (!_widget_id) { - ErrPrint("Heap: %d\n", errno); - free(_category); - free(_cluster); - return NULL; - } - - if (content_info) { - _content_info = strdup(content_info); - if (!_content_info) { - ErrPrint("Heap: %d\n", errno); - free(_widget_id); - free(_category); - free(_cluster); - return NULL; - } - } else { - _content_info = NULL; - } - - if (!s_info.smart) { - s_info.sc.add = __widget_add; - s_info.sc.del = __widget_del; - s_info.sc.move = __widget_move; - s_info.sc.resize = __widget_resize; - s_info.sc.show = __widget_show; - s_info.sc.hide = __widget_hide; - s_info.sc.color_set = __widget_color_set; - s_info.sc.clip_set = __widget_clip_set; - s_info.sc.clip_unset = __widget_clip_unset; - - s_info.smart = evas_smart_class_new(&s_info.sc); - } - - widget = evas_object_smart_add(evas_object_evas_get(parent), s_info.smart); - - data = evas_object_smart_data_get(widget); - if (data) { - data->parent = parent; - data->widget_id = _widget_id; - data->content = _content_info; - data->cluster = _cluster; - data->category = _category; - data->is.field.mouse_event = 0; - data->period = period; - - __widget_data_setup(data); - } else { - ErrPrint("Failed to get smart data\n"); - free(_widget_id); - free(_content_info); - free(_cluster); - free(_category); - } + return WIDGET_ERROR_NOT_SUPPORTED; +} - return widget; +EAPI Evas_Object *widget_viewer_evas_add_widget(Evas_Object *parent, const char *widget_id, const char *content_info, double period) +{ + return WIDGET_ERROR_NOT_SUPPORTED; } EAPI int widget_viewer_evas_set_view_port(Evas_Object *widget, int x, int y, int w, int h) { - struct widget_data *data; - - if (!is_widget_feature_enabled()) { - return WIDGET_ERROR_NOT_SUPPORTED; - } - - if (!s_info.initialized) { - return WIDGET_ERROR_FAULT; - } - - data = get_smart_data(widget); - if (!data) { - return WIDGET_ERROR_INVALID_PARAMETER; - } - - data->view_port.x = x; - data->view_port.y = y; - data->view_port.w = w; - data->view_port.h = h; - s_info.conf.field.user_view_port = 1; - return WIDGET_ERROR_NONE; + return WIDGET_ERROR_NOT_SUPPORTED; } EAPI int widget_viewer_evas_get_view_port(Evas_Object *widget, int *x, int *y, int *w, int *h) { - struct widget_data *data; - - if (!is_widget_feature_enabled()) { - return WIDGET_ERROR_NOT_SUPPORTED; - } - - if (!s_info.initialized) { - return WIDGET_ERROR_FAULT; - } - - data = get_smart_data(widget); - if (!data) { - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (x) { - *x = data->view_port.x; - } - - if (y) { - *y = data->view_port.y; - } - - if (w) { - *w = data->view_port.w; - } - - if (h) { - *h = data->view_port.h; - } - - return WIDGET_ERROR_NONE; + return WIDGET_ERROR_NOT_SUPPORTED; } EAPI int widget_viewer_evas_set_option(widget_evas_conf_e type, int value) { - int ret = WIDGET_ERROR_NONE; - - if (!is_widget_feature_enabled()) { - return WIDGET_ERROR_NOT_SUPPORTED; - } - - switch ((int)type) { - case WIDGET_VIEWER_EVAS_SENSITIVE_MOVE: - s_info.conf.field.sensitive_move = value; - break; - case WIDGET_VIEWER_EVAS_EVENT_AUTO_FEED: - s_info.conf.field.auto_feed = value; - break; - case WIDGET_VIEWER_EVAS_EASY_MODE: - s_info.conf.field.easy_mode = value; - break; - case WIDGET_VIEWER_EVAS_USE_FIXED_SIZE: - s_info.conf.field.use_fixed_size = value; - break; - case WIDGET_VIEWER_EVAS_MANUAL_PAUSE_RESUME: - s_info.conf.field.manual_pause_resume = value; - break; - case WIDGET_VIEWER_EVAS_SHARED_CONTENT: - (void)widget_viewer_set_option(WIDGET_OPTION_SHARED_CONTENT, value); - break; - case WIDGET_VIEWER_EVAS_SUPPORT_GBAR: - s_info.conf.field.support_gbar = value; - break; - case WIDGET_VIEWER_EVAS_SCROLL_X: - s_info.conf.field.is_scroll_x = value; - break; - case WIDGET_VIEWER_EVAS_SCROLL_Y: - s_info.conf.field.is_scroll_y = value; - break; - case WIDGET_VIEWER_EVAS_DELAYED_RESUME: - s_info.conf.field.delayed_resume = value; - break; - case WIDGET_VIEWER_EVAS_AUTO_RENDER_SELECTION: - s_info.conf.field.auto_render_selector = value; - break; - case WIDGET_VIEWER_EVAS_DIRECT_UPDATE: - (void)widget_viewer_set_option(WIDGET_OPTION_DIRECT_UPDATE, !!value); - break; - case WIDGET_VIEWER_EVAS_USE_RENDER_ANIMATOR: - if (s_info.conf.field.auto_render_selector) { - DbgPrint("Auto selector enabled, this render_animator option will be changed automatically\n"); - } - - s_info.conf.field.render_animator = !!value; - DbgPrint("Turn %s render animator\n", s_info.conf.field.render_animator ? "on" : "off"); - break; - case WIDGET_VIEWER_EVAS_SKIP_ACQUIRE: - s_info.conf.field.skip_acquire = !!value; - DbgPrint("Turn %s skip-acquire option\n", s_info.conf.field.skip_acquire ? "on" : "off"); - break; - case WIDGET_VIEWER_EVAS_DISABLE_SCROLLER: - s_info.conf.field.disable_internal_scroller = !!value; - DbgPrint("Turn %s internal_scroller option\n", s_info.conf.field.disable_internal_scroller ? "off" : "on"); - break; - default: - ret = WIDGET_ERROR_INVALID_PARAMETER; - break; - } - - return ret; + return WIDGET_ERROR_NOT_SUPPORTED; } EAPI int widget_viewer_evas_pause_widget(Evas_Object *widget) { - struct widget_data *data; - - if (!is_widget_feature_enabled()) { - return WIDGET_ERROR_NOT_SUPPORTED; - } - - if (!s_info.initialized) { - return WIDGET_ERROR_FAULT; - } - - data = get_smart_data(widget); - if (!data || !data->is.field.created || !data->handle) { - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (data->delayed_resume_timer) { - (void)ecore_timer_del(data->delayed_resume_timer); - data->delayed_resume_timer = NULL; - } - - return widget_viewer_set_visibility(data->handle, WIDGET_HIDE_WITH_PAUSE); + return WIDGET_ERROR_NOT_SUPPORTED; } EAPI int widget_viewer_evas_resume_widget(Evas_Object *widget) { - struct widget_data *data; - - if (!is_widget_feature_enabled()) { - return WIDGET_ERROR_NOT_SUPPORTED; - } - - if (!s_info.initialized) { - return WIDGET_ERROR_FAULT; - } - - data = get_smart_data(widget); - if (!data || !data->is.field.created || !data->handle) { - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (data->delayed_resume_timer) { - (void)ecore_timer_del(data->delayed_resume_timer); - data->delayed_resume_timer = NULL; - } - - data->is.field.initial_resumed = 1; - return widget_viewer_set_visibility(data->handle, WIDGET_SHOW); + return WIDGET_ERROR_NOT_SUPPORTED; } EAPI int widget_viewer_evas_destroy_glance_bar(Evas_Object *widget) { - struct widget_data *data; - int ret; - - if (!is_widget_feature_enabled()) { - return WIDGET_ERROR_NOT_SUPPORTED; - } - - if (!s_info.initialized) { - return WIDGET_ERROR_FAULT; - } - - data = get_smart_data(widget); - if (!data || data->state != WIDGET_DATA_CREATED || !data->is.field.created || !data->handle || !data->is.field.gbar_created) { - return WIDGET_ERROR_INVALID_PARAMETER; - } - - ret = widget_viewer_destroy_glance_bar(data->handle, __widget_destroy_gbar_cb, widget_ref(data)); - if (ret < 0) { - widget_unref(data); - } - - return ret; + return WIDGET_ERROR_NOT_SUPPORTED; } EAPI const char *widget_viewer_evas_get_content_info(Evas_Object *widget) { - struct widget_data *data; - - if (!is_widget_feature_enabled()) { - return NULL; - } - - if (!s_info.initialized) { - return NULL; - } - - data = get_smart_data(widget); - if (!data || !data->is.field.created || !data->handle) { - return NULL; - } - - return widget_viewer_get_content_string(data->handle); + return WIDGET_ERROR_NOT_SUPPORTED; } EAPI const char *widget_viewer_evas_get_title_string(Evas_Object *widget) { - struct widget_data *data; - - if (!is_widget_feature_enabled()) { - return NULL; - } - - if (!s_info.initialized) { - return NULL; - } - - data = get_smart_data(widget); - if (!data || !data->is.field.created || !data->handle) { - return NULL; - } - - return widget_viewer_get_title_string(data->handle); + return WIDGET_ERROR_NOT_SUPPORTED; } EAPI const char *widget_viewer_evas_get_widget_id(Evas_Object *widget) { - struct widget_data *data; - - if (!is_widget_feature_enabled()) { - return NULL; - } - - if (!s_info.initialized) { - return NULL; - } - - data = get_smart_data(widget); - if (!data || data->state != WIDGET_DATA_CREATED) { - return NULL; - } - - return data->widget_id; + return WIDGET_ERROR_NOT_SUPPORTED; } EAPI double widget_viewer_evas_get_period(Evas_Object *widget) { - struct widget_data *data; - - if (!is_widget_feature_enabled()) { - return 0.0f; - } - - if (!s_info.initialized) { - return 0.0f; - } - - data = get_smart_data(widget); - if (!data || !data->is.field.created || !data->handle) { - return 0.0f; - } - - return data->period; + return WIDGET_ERROR_NOT_SUPPORTED; } EAPI void widget_viewer_evas_cancel_click_event(Evas_Object *widget) { - struct widget_data *data; - - if (!is_widget_feature_enabled()) { - return; - } - - if (!s_info.initialized) { - return; - } - - data = get_smart_data(widget); - if (!data || !data->is.field.created || !data->handle) { - return; - } - - if (!data->pressed) { - DbgPrint("Cancel ignored\n"); - return; - } - - if (data->is.field.cancel_click == CANCEL_DISABLED) { - data->is.field.cancel_click = CANCEL_USER; - } -} - -#if defined(ELM_ACCESS_ENABLED) -static void access_ret_cb(struct widget *handle, int ret, void *data) -{ - struct access_ret_cb_data *cb_data = data; - - switch (ret) { - case WIDGET_ACCESS_STATUS_ERROR: - ret = WIDGET_ACCESS_RESULT_ERROR; - break; - case WIDGET_ACCESS_STATUS_DONE: - ret = WIDGET_ACCESS_RESULT_DONE; - break; - case WIDGET_ACCESS_STATUS_FIRST: - ret = WIDGET_ACCESS_RESULT_FIRST; - break; - case WIDGET_ACCESS_STATUS_LAST: - ret = WIDGET_ACCESS_RESULT_LAST; - break; - case WIDGET_ACCESS_STATUS_READ: - ret = WIDGET_ACCESS_RESULT_READ; - break; - default: - ret = WIDGET_ACCESS_RESULT_UNKNOWN; - break; - } - - if (cb_data->ret_cb) { - cb_data->ret_cb(cb_data->obj, ret, cb_data->data); - } - - free(cb_data); + return WIDGET_ERROR_NOT_SUPPORTED; } -#endif EAPI int widget_viewer_evas_feed_mouse_up_event(Evas_Object *widget) { - struct widget_data *data; - - if (!is_widget_feature_enabled()) { - return WIDGET_ERROR_NOT_SUPPORTED; - } - - if (!s_info.initialized) { - return WIDGET_ERROR_FAULT; - } - - data = get_smart_data(widget); - if (!data || !data->is.field.created || !data->handle) { - return WIDGET_ERROR_INVALID_PARAMETER; - } - - return do_force_mouse_up(data); + return WIDGET_ERROR_NOT_SUPPORTED; } EAPI int widget_viewer_evas_feed_access_event(Evas_Object *widget, int type, void *_info, void (*ret_cb)(Evas_Object *obj, int ret, void *data), void *cbdata) { - if (!is_widget_feature_enabled()) { - return WIDGET_ERROR_NOT_SUPPORTED; - } - -#if defined(ELM_ACCESS_ENABLED) - struct widget_data *data; - Elm_Access_Action_Info *info = _info; - int w; - int h; - struct access_ret_cb_data *cb_data; - int ret; - struct widget_access_event_info ainfo; - - if (!s_info.initialized) { - return WIDGET_ERROR_FAULT; - } - - data = get_smart_data(widget); - if (!data || !data->is.field.created || !data->handle) { - return WIDGET_ERROR_INVALID_PARAMETER; - } - - evas_object_geometry_get(data->widget_layout, NULL, NULL, &w, &h); - ainfo.x = (double)info->x / (double)w; - ainfo.y = (double)info->y / (double)h; - ainfo.info = 0; - - switch (type) { - case ELM_ACCESS_ACTION_HIGHLIGHT: /* highlight an object */ - DbgPrint("Highlight %dx%d ignored\n", info->x, info->y); - break; - case ELM_ACCESS_ACTION_READ: - cb_data = calloc(1, sizeof(*cb_data)); - if (!cb_data) { - ErrPrint("Heap: %d\n", errno); - return WIDGET_ERROR_OUT_OF_MEMORY; - } - - cb_data->ret_cb = ret_cb; - cb_data->data = cbdata; - cb_data->obj = widget; - - ainfo.type = WIDGET_ACCESS_TYPE_HIGHLIGHT; - ret = widget_viewer_feed_access_event(data->handle, WIDGET_ACCESS_HIGHLIGHT, &ainfo, access_ret_cb, cb_data); - if (ret != WIDGET_ERROR_NONE) { - free(cb_data); - } - break; - case ELM_ACCESS_ACTION_UNHIGHLIGHT: /* unhighlight an object */ - cb_data = calloc(1, sizeof(*cb_data)); - if (!cb_data) { - ErrPrint("Heap: %d\n", errno); - return WIDGET_ERROR_OUT_OF_MEMORY; - } - - cb_data->ret_cb = ret_cb; - cb_data->data = cbdata; - cb_data->obj = widget; - - ainfo.type = WIDGET_ACCESS_TYPE_UNHIGHLIGHT; - ret = widget_viewer_feed_access_event(data->handle, WIDGET_ACCESS_HIGHLIGHT, &ainfo, access_ret_cb, cb_data); - if (ret != WIDGET_ERROR_NONE) { - free(cb_data); - } - break; - case ELM_ACCESS_ACTION_HIGHLIGHT_NEXT: /* set highlight to next object */ - cb_data = calloc(1, sizeof(*cb_data)); - if (!cb_data) { - ErrPrint("Heap: %d\n", errno); - return WIDGET_ERROR_OUT_OF_MEMORY; - } - - cb_data->ret_cb = ret_cb; - cb_data->data = cbdata; - cb_data->obj = widget; - - ainfo.type = WIDGET_ACCESS_TYPE_HIGHLIGHT_NEXT; - ret = widget_viewer_feed_access_event(data->handle, WIDGET_ACCESS_HIGHLIGHT, &ainfo, access_ret_cb, cb_data); - if (ret != WIDGET_ERROR_NONE) { - free(cb_data); - } - break; - case ELM_ACCESS_ACTION_HIGHLIGHT_PREV: /* set highlight to previous object */ - cb_data = calloc(1, sizeof(*cb_data)); - if (!cb_data) { - ErrPrint("Heap: %d\n", errno); - return WIDGET_ERROR_OUT_OF_MEMORY; - } - - cb_data->ret_cb = ret_cb; - cb_data->data = cbdata; - cb_data->obj = widget; - - ainfo.type = WIDGET_ACCESS_TYPE_HIGHLIGHT_NEXT; - ret = widget_viewer_feed_access_event(data->handle, WIDGET_ACCESS_HIGHLIGHT, &ainfo, access_ret_cb, cb_data); - if (ret != WIDGET_ERROR_NONE) { - free(cb_data); - } - break; - case ELM_ACCESS_ACTION_ACTIVATE: /* activate a highlight object */ - cb_data = calloc(1, sizeof(*cb_data)); - if (!cb_data) { - ErrPrint("Heap: %d\n", errno); - return WIDGET_ERROR_OUT_OF_MEMORY; - } - - cb_data->ret_cb = ret_cb; - cb_data->data = cbdata; - cb_data->obj = widget; - - ainfo.type = WIDGET_ACCESS_TYPE_NONE; /* meaningless */ - ret = widget_viewer_feed_access_event(data->handle, WIDGET_ACCESS_ACTIVATE, &ainfo, access_ret_cb, cb_data); - if (ret != WIDGET_ERROR_NONE) { - free(cb_data); - } - break; - case ELM_ACCESS_ACTION_SCROLL: /* scroll if one of highlight object parents * is scrollable */ - cb_data = calloc(1, sizeof(*cb_data)); - if (!cb_data) { - ErrPrint("Heap: %d\n", errno); - return WIDGET_ERROR_OUT_OF_MEMORY; - } - - cb_data->ret_cb = ret_cb; - cb_data->data = cbdata; - cb_data->obj = widget; - - switch (info->mouse_type) { - case 0: - ainfo.type = WIDGET_ACCESS_TYPE_DOWN; - ret = widget_viewer_feed_access_event(data->handle, WIDGET_ACCESS_SCROLL, &ainfo, access_ret_cb, cb_data); - if (ret != WIDGET_ERROR_NONE) { - free(cb_data); - } - break; - case 1: - ainfo.type = WIDGET_ACCESS_TYPE_MOVE; - ret = widget_viewer_feed_access_event(data->handle, WIDGET_ACCESS_SCROLL, &ainfo, access_ret_cb, cb_data); - if (ret != WIDGET_ERROR_NONE) { - free(cb_data); - } - break; - case 2: - ainfo.type = WIDGET_ACCESS_TYPE_UP; - ret = widget_viewer_feed_access_event(data->handle, WIDGET_ACCESS_SCROLL, &ainfo, access_ret_cb, cb_data); - if (ret != WIDGET_ERROR_NONE) { - free(cb_data); - } - break; - default: - ret = WIDGET_ERROR_INVALID_PARAMETER; - free(cb_data); - break; - } - break; - case ELM_ACCESS_ACTION_MOUSE: /* give mouse event to highlight object */ - cb_data = calloc(1, sizeof(*cb_data)); - if (!cb_data) { - ErrPrint("Heap: %d\n", errno); - return WIDGET_ERROR_OUT_OF_MEMORY; - } - - cb_data->ret_cb = ret_cb; - cb_data->data = cbdata; - cb_data->obj = widget; - ainfo.type = WIDGET_ACCESS_TYPE_NONE; - ret = widget_viewer_feed_access_event(data->handle, WIDGET_ACCESS_MOUSE, &ainfo, access_ret_cb, cb_data); - if (ret != WIDGET_ERROR_NONE) { - free(cb_data); - } - break; - case ELM_ACCESS_ACTION_UP: /* change value up of highlight object */ - cb_data = calloc(1, sizeof(*cb_data)); - if (!cb_data) { - ErrPrint("Heap: %d\n", errno); - return WIDGET_ERROR_OUT_OF_MEMORY; - } - - cb_data->ret_cb = ret_cb; - cb_data->data = cbdata; - cb_data->obj = widget; - ainfo.type = WIDGET_ACCESS_TYPE_UP; - ret = widget_viewer_feed_access_event(data->handle, WIDGET_ACCESS_ACTION, &ainfo, access_ret_cb, cb_data); - if (ret != WIDGET_ERROR_NONE) { - free(cb_data); - } - break; - case ELM_ACCESS_ACTION_DOWN: /* change value down of highlight object */ - cb_data = calloc(1, sizeof(*cb_data)); - if (!cb_data) { - ErrPrint("Heap: %d\n", errno); - return WIDGET_ERROR_OUT_OF_MEMORY; - } - - cb_data->ret_cb = ret_cb; - cb_data->data = cbdata; - cb_data->obj = widget; - - ainfo.type = WIDGET_ACCESS_TYPE_DOWN; - ret = widget_viewer_feed_access_event(data->handle, WIDGET_ACCESS_ACTION, &ainfo, access_ret_cb, cb_data); - if (ret != WIDGET_ERROR_NONE) { - free(cb_data); - } - break; - case ELM_ACCESS_ACTION_VALUE_CHANGE: /* TODO: deprecate this */ - cb_data = calloc(1, sizeof(*cb_data)); - if (!cb_data) { - ErrPrint("Heap: %d\n", errno); - return WIDGET_ERROR_OUT_OF_MEMORY; - } - - cb_data->ret_cb = ret_cb; - cb_data->data = cbdata; - cb_data->obj = widget; - - ainfo.type = WIDGET_ACCESS_TYPE_NONE; - ret = widget_viewer_feed_access_event(data->handle, WIDGET_ACCESS_VALUE_CHANGE, &ainfo, access_ret_cb, cb_data); - if (ret != WIDGET_ERROR_NONE) { - free(cb_data); - } - break; - case ELM_ACCESS_ACTION_BACK: /* go back to a previous view ex: pop naviframe item */ - cb_data = calloc(1, sizeof(*cb_data)); - if (!cb_data) { - ErrPrint("Heap: %d\n", errno); - return WIDGET_ERROR_OUT_OF_MEMORY; - } - - cb_data->ret_cb = ret_cb; - cb_data->data = cbdata; - cb_data->obj = widget; - - ainfo.type = WIDGET_ACCESS_TYPE_NONE; - ret = widget_viewer_feed_access_event(data->handle, WIDGET_ACCESS_BACK, &ainfo, access_ret_cb, cb_data); - if (ret != WIDGET_ERROR_NONE) { - free(cb_data); - } - break; - case ELM_ACCESS_ACTION_OVER: /* mouse over an object */ - cb_data = calloc(1, sizeof(*cb_data)); - if (!cb_data) { - ErrPrint("Heap: %d\n", errno); - return WIDGET_ERROR_OUT_OF_MEMORY; - } - - cb_data->ret_cb = ret_cb; - cb_data->data = cbdata; - cb_data->obj = widget; - - ainfo.type = WIDGET_ACCESS_TYPE_NONE; - ret = widget_viewer_feed_access_event(data->handle, WIDGET_ACCESS_OVER, &ainfo, access_ret_cb, cb_data); - if (ret != WIDGET_ERROR_NONE) { - free(cb_data); - } - break; - case ELM_ACCESS_ACTION_ENABLE: /* enable highlight and read ability */ - cb_data = calloc(1, sizeof(*cb_data)); - if (!cb_data) { - ErrPrint("Heap: %d\n", errno); - return WIDGET_ERROR_OUT_OF_MEMORY; - } - - cb_data->ret_cb = ret_cb; - cb_data->data = cbdata; - cb_data->obj = widget; - - ainfo.type = WIDGET_ACCESS_TYPE_ENABLE; - ret = widget_viewer_feed_access_event(data->handle, WIDGET_ACCESS_ENABLE, &ainfo, access_ret_cb, cb_data); - if (ret != WIDGET_ERROR_NONE) { - free(cb_data); - } - break; - case ELM_ACCESS_ACTION_DISABLE: /* disable highlight and read ability */ - cb_data = calloc(1, sizeof(*cb_data)); - if (!cb_data) { - ErrPrint("Heap: %d\n", errno); - return WIDGET_ERROR_OUT_OF_MEMORY; - } - - cb_data->ret_cb = ret_cb; - cb_data->data = cbdata; - cb_data->obj = widget; - - ainfo.type = WIDGET_ACCESS_TYPE_DISABLE; - ret = widget_viewer_feed_access_event(data->handle, WIDGET_ACCESS_ENABLE, &ainfo, access_ret_cb, cb_data); - if (ret != WIDGET_ERROR_NONE) { - free(cb_data); - } - break; - default: - ret = WIDGET_ERROR_INVALID_PARAMETER; - break; - } - - return ret; -#else return WIDGET_ERROR_NOT_SUPPORTED; -#endif } /** @@ -7749,23 +228,7 @@ EAPI int widget_viewer_evas_feed_access_event(Evas_Object *widget, int type, voi */ EAPI void widget_viewer_evas_disable_preview(Evas_Object *widget) { - struct widget_data *data; - - if (!is_widget_feature_enabled()) { - return; - } - - if (!s_info.initialized) { - return; - } - - data = get_smart_data(widget); - if (!data) { - ErrPrint("Invalid object\n"); - return; - } - - data->is.field.disable_preview = 1; + return; } /** @@ -7776,23 +239,7 @@ EAPI void widget_viewer_evas_disable_preview(Evas_Object *widget) */ EAPI void widget_viewer_evas_disable_overlay_text(Evas_Object *widget) { - struct widget_data *data; - - if (!is_widget_feature_enabled()) { - return; - } - - if (!s_info.initialized) { - return; - } - - data = get_smart_data(widget); - if (!data) { - ErrPrint("Invalid object\n"); - return; - } - - data->is.field.disable_text = 1; + return; } /** @@ -7803,637 +250,102 @@ EAPI void widget_viewer_evas_disable_overlay_text(Evas_Object *widget) */ EAPI void widget_viewer_evas_disable_loading(Evas_Object *widget) { - struct widget_data *data; - - if (!is_widget_feature_enabled()) { - return; - } - - if (!s_info.initialized) { - return; - } - - data = get_smart_data(widget); - if (!data) { - ErrPrint("Invalid object\n"); - return; - } - - data->is.field.disable_loading = 1; + return; } EAPI void widget_viewer_evas_activate_faulted_widget(Evas_Object *widget) { - struct widget_data *data; - - if (!is_widget_feature_enabled()) { - return; - } - - if (!s_info.initialized) { - return; - } - - data = get_smart_data(widget); - if (!data) { - ErrPrint("Invalid object\n"); - return; - } - - if (data->is.field.faulted) { - elm_object_signal_emit(data->widget_layout, "mouse,clicked,1", "overlay,content"); - } else { - DbgPrint("widget is not faulted\n"); - } + return; } EAPI bool widget_viewer_evas_is_faulted(Evas_Object *widget) { - struct widget_data *data; - - if (!is_widget_feature_enabled()) { - return false; - } - - if (!s_info.initialized) { - return 0; - } - - data = get_smart_data(widget); - if (!data) { - ErrPrint("Invalid object\n"); - return 0; - } - - return (bool)data->is.field.faulted; + return false; } EAPI int widget_viewer_evas_set_raw_event_callback(widget_evas_raw_event_type_e type, raw_event_cb cb, void *data) { - struct raw_event_cbdata *cbdata; - - if (!is_widget_feature_enabled()) { - return WIDGET_ERROR_NOT_SUPPORTED; - } - - cbdata = calloc(1, sizeof(*cbdata)); - if (!cbdata) { - ErrPrint("calloc: %d\n", errno); - return WIDGET_ERROR_OUT_OF_MEMORY; - } - - cbdata->cb = cb; - cbdata->data = data; - - switch (type) { - case WIDGET_VIEWER_EVAS_RAW_DELETE: - s_info.raw_event.delete_list = eina_list_append(s_info.raw_event.delete_list, cbdata); - break; - case WIDGET_VIEWER_EVAS_RAW_CREATE: - s_info.raw_event.create_list = eina_list_append(s_info.raw_event.create_list, cbdata); - break; - default: - free(cbdata); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - return WIDGET_ERROR_NONE; + return WIDGET_ERROR_NOT_SUPPORTED; } EAPI int widget_viewer_evas_unset_raw_event_callback(widget_evas_raw_event_type_e type, raw_event_cb cb, void *data) { - Eina_List *l; - Eina_List *n; - struct raw_event_cbdata *cbdata; - - if (!is_widget_feature_enabled()) { - return WIDGET_ERROR_NOT_SUPPORTED; - } - - switch (type) { - case WIDGET_VIEWER_EVAS_RAW_DELETE: - EINA_LIST_FOREACH_SAFE(s_info.raw_event.delete_list, l, n, cbdata) { - if (cbdata->cb == cb && cbdata->data == data) { - s_info.raw_event.delete_list = eina_list_remove(s_info.raw_event.delete_list, cbdata); - break; - } - } - break; - case WIDGET_VIEWER_EVAS_RAW_CREATE: - EINA_LIST_FOREACH_SAFE(s_info.raw_event.create_list, l, n, cbdata) { - if (cbdata->cb == cb && cbdata->data == data) { - s_info.raw_event.create_list = eina_list_remove(s_info.raw_event.create_list, cbdata); - break; - } - } - break; - default: - break; - } - - return WIDGET_ERROR_NONE; + return WIDGET_ERROR_NOT_SUPPORTED; } EAPI int widget_viewer_evas_freeze_visibility(Evas_Object *widget, widget_visibility_status_e status) { - struct widget_data *data; - - if (!is_widget_feature_enabled()) { - return WIDGET_ERROR_NOT_SUPPORTED; - } - - if (!s_info.initialized) { - return WIDGET_ERROR_FAULT; - } - - data = get_smart_data(widget); - if (!data) { - ErrPrint("Invalid object\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - data->is.field.freeze_visibility = 1; - data->freezed_visibility = status; - return WIDGET_ERROR_NONE; + return WIDGET_ERROR_NOT_SUPPORTED; } EAPI int widget_viewer_evas_thaw_visibility(Evas_Object *widget) { - struct widget_data *data; - - if (!is_widget_feature_enabled()) { - return WIDGET_ERROR_NOT_SUPPORTED; - } - - if (!s_info.initialized) { - return WIDGET_ERROR_FAULT; - } - - data = get_smart_data(widget); - if (!data) { - ErrPrint("Invalid object\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - data->is.field.freeze_visibility = 0; - - return WIDGET_ERROR_NONE; + return WIDGET_ERROR_NOT_SUPPORTED; } EAPI bool widget_viewer_evas_is_visibility_frozen(Evas_Object *widget) { - struct widget_data *data; - - if (!is_widget_feature_enabled()) { - return false; - } - - if (!s_info.initialized) { - ErrPrint("Not initialized\n"); - return false; - } - - data = get_smart_data(widget); - if (!data) { - ErrPrint("Invalid object\n"); - return false; - } - - return (bool)data->is.field.freeze_visibility; + return false; } EAPI int widget_viewer_evas_dump_to_file(Evas_Object *widget, const char *filename) { - struct widget_data *data; - FILE *fp; - - if (!is_widget_feature_enabled()) { - return WIDGET_ERROR_NOT_SUPPORTED; - } - - if (!s_info.initialized) { - return WIDGET_ERROR_FAULT; - } - - data = get_smart_data(widget); - if (!data) { - ErrPrint("Invalid object\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - fp = fopen(filename, "w+"); - if (fp) { - Evas_Object *image; - image = elm_object_part_content_get(data->widget_layout, "widget,content"); - if (image) { - void *data; - Evas_Coord w, h; - evas_object_geometry_get(image, NULL, NULL, &w, &h); - - data = evas_object_image_data_get(image, 0); - if (data) { - fwrite(data, w * h, sizeof(int), fp); - } - } - fclose(fp); - } - - return WIDGET_ERROR_NONE; + return WIDGET_ERROR_NOT_SUPPORTED; } EAPI bool widget_viewer_evas_is_widget(Evas_Object *widget) { - struct widget_data *data; - - if (!is_widget_feature_enabled()) { - return false; - } - - if (!s_info.initialized) { - return false; - } - - data = get_smart_data(widget); - if (!data) { - ErrPrint("Invalid object\n"); - return false; - } - - return true; + return false; } EAPI void widget_viewer_evas_set_permanent_delete(Evas_Object *widget, int flag) { - struct widget_data *data; - - if (!is_widget_feature_enabled()) { - return; - } - - if (!s_info.initialized) { - return; - } - - data = get_smart_data(widget); - if (!data) { - ErrPrint("Invalid object\n"); - return; - } - - data->is.field.permanent_delete = !!flag; + return; } EAPI int widget_viewer_evas_subscribe_group(const char *cluster, const char *sub_cluster) { - struct subscribe_group *group; - Eina_List *l; - int ret; - - if (!is_widget_feature_enabled()) { - return WIDGET_ERROR_NOT_SUPPORTED; - } - - if (!s_info.initialized) { - return WIDGET_ERROR_FAULT; - } - - if (!cluster || !sub_cluster) { - return WIDGET_ERROR_INVALID_PARAMETER; - } - - EINA_LIST_FOREACH(s_info.subscribed_group_list, l, group) { - if (!strcasecmp(group->cluster, cluster) && !strcasecmp(group->sub_cluster, sub_cluster)) { - return WIDGET_ERROR_ALREADY_EXIST; - } - } - - group = calloc(1, sizeof(*group)); - if (!group) { - ErrPrint("calloc: %d\n", errno); - return WIDGET_ERROR_OUT_OF_MEMORY; - } - - group->cluster = strdup(cluster); - if (!group->cluster) { - ErrPrint("strdup: %d\n", errno); - free(group); - return WIDGET_ERROR_OUT_OF_MEMORY; - } - - group->sub_cluster = strdup(sub_cluster); - if (!group->sub_cluster) { - ErrPrint("strdup: %d\n", errno); - free(group->cluster); - free(group); - return WIDGET_ERROR_OUT_OF_MEMORY; - } - - ret = widget_viewer_subscribe_group(cluster, sub_cluster); - if (ret != WIDGET_ERROR_NONE) { - free(group->sub_cluster); - free(group->cluster); - free(group); - return ret; - } - - s_info.subscribed_group_list = eina_list_append(s_info.subscribed_group_list, group); - - return WIDGET_ERROR_NONE; + return WIDGET_ERROR_NOT_SUPPORTED; } EAPI int widget_viewer_evas_unsubscribe_group(const char *cluster, const char *sub_cluster) { - struct subscribe_group *group; - Eina_List *l; - Eina_List *n; - - if (!is_widget_feature_enabled()) { - return WIDGET_ERROR_NOT_SUPPORTED; - } - - if (!s_info.initialized) { - return WIDGET_ERROR_FAULT; - } - - if (!cluster || !sub_cluster) { - return WIDGET_ERROR_INVALID_PARAMETER; - } - - EINA_LIST_FOREACH_SAFE(s_info.subscribed_group_list, l, n, group) { - if (!strcasecmp(group->cluster, cluster) && !strcasecmp(group->sub_cluster, sub_cluster)) { - s_info.subscribed_group_list = eina_list_remove(s_info.subscribed_group_list, group); - free(group->cluster); - free(group->sub_cluster); - free(group); - return widget_viewer_unsubscribe_group(cluster, sub_cluster); - } - } - - return WIDGET_ERROR_NOT_EXIST; + return WIDGET_ERROR_NOT_SUPPORTED; } EAPI int widget_viewer_evas_subscribe_category(const char *category) { - struct subscribe_category *item; - Eina_List *l; - int ret; - - if (!is_widget_feature_enabled()) { - return WIDGET_ERROR_NOT_SUPPORTED; - } - - if (!s_info.initialized) { - return WIDGET_ERROR_FAULT; - } - - if (!category) { - return WIDGET_ERROR_INVALID_PARAMETER; - } - - EINA_LIST_FOREACH(s_info.subscribed_category_list, l, item) { - if (!strcmp(category, item->category)) { - return WIDGET_ERROR_ALREADY_EXIST; - } - } - - item = calloc(1, sizeof(*item)); - if (!item) { - ErrPrint("calloc: %d\n", errno); - return WIDGET_ERROR_OUT_OF_MEMORY; - } - - item->category = strdup(category); - if (!item->category) { - ErrPrint("strdup: %d\n", errno); - free(item); - return WIDGET_ERROR_OUT_OF_MEMORY; - } - - ret = widget_viewer_subscribe_category(category); - if (ret != WIDGET_ERROR_NONE) { - free(item->category); - free(item); - return ret; - } - - s_info.subscribed_category_list = eina_list_append(s_info.subscribed_category_list, item); - return WIDGET_ERROR_NONE; + return WIDGET_ERROR_NOT_SUPPORTED; } EAPI int widget_viewer_evas_unsubscribe_category(const char *category) { - Eina_List *l; - Eina_List *n; - struct subscribe_category *item; - - if (!is_widget_feature_enabled()) { - return WIDGET_ERROR_NOT_SUPPORTED; - } - - if (!s_info.initialized) { - return WIDGET_ERROR_FAULT; - } - - if (!category) { - return WIDGET_ERROR_INVALID_PARAMETER; - } - - EINA_LIST_FOREACH_SAFE(s_info.subscribed_category_list, l, n, item) { - if (!strcmp(item->category, category)) { - s_info.subscribed_category_list = eina_list_remove(s_info.subscribed_category_list, item); - free(item->category); - free(item); - return widget_viewer_unsubscribe_category(category); - } - } - - return WIDGET_ERROR_NOT_EXIST; -} - -static void text_signal_cb(widget_h handle, int ret, void *data) -{ - /* TODO : add codes to invoke smart event callback function */ + return WIDGET_ERROR_NOT_SUPPORTED; } EAPI int widget_viewer_evas_emit_text_signal(Evas_Object *widget, widget_text_signal_s event_info, void *data) { - struct widget_data *widget_data_from_evas; - - if (!is_widget_feature_enabled()) { - return WIDGET_ERROR_NOT_SUPPORTED; - } - - if (!s_info.initialized) { - return WIDGET_ERROR_FAULT; - } - - widget_data_from_evas = get_smart_data(widget); - - if (!widget_data_from_evas) { - ErrPrint("Invalid object\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - return widget_viewer_emit_text_signal(widget_data_from_evas->handle, event_info, text_signal_cb, data); + return WIDGET_ERROR_NOT_SUPPORTED; } EAPI int widget_viewer_evas_get_instance_id(Evas_Object *widget, char **instance_id) { - struct widget_data *data; - - if (!is_widget_feature_enabled()) { - return WIDGET_ERROR_NOT_SUPPORTED; - } - - if (!s_info.initialized) { - return WIDGET_ERROR_FAULT; - } - - data = get_smart_data(widget); - if (!data) { - ErrPrint("Invalid object\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - return widget_viewer_get_instance_id(data->handle, instance_id); + return WIDGET_ERROR_NOT_SUPPORTED; } EAPI int widget_viewer_evas_set_widget_option(Evas_Object *widget, widget_option_widget_e option, int value) { - struct widget_data *data; - - if (!is_widget_feature_enabled()) { - return WIDGET_ERROR_NOT_SUPPORTED; - } - - if (!s_info.initialized) { - return WIDGET_ERROR_FAULT; - } - - data = get_smart_data(widget); - if (!data) { - ErrPrint("Invalid object\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - switch (option) { - case WIDGET_OPTION_WIDGET_DELAYED_RESUME: - data->is.field.delayed_resume = (value & 0x03); - break; - case WIDGET_OPTION_WIDGET_DISABLE_OVERLAY_ANIMATION: - data->is.field.disabled_overlay_animation = !!value; - break; - case WIDGET_OPTION_WIDGET_MANUAL_OVERLAY_HIDE: - data->is.field.hide_overlay_manually = !!value; - break; - default: - return WIDGET_ERROR_INVALID_PARAMETER; - } - - return WIDGET_ERROR_NONE; + return WIDGET_ERROR_NOT_SUPPORTED; } EAPI int widget_viewer_evas_set_preview_image(Evas_Object *widget, widget_size_type_e type, const char *preview) { - struct widget_data *data; - Eina_List *l; - Eina_List *n; - struct preview_info *info; - - if (!is_widget_feature_enabled()) { - return WIDGET_ERROR_NOT_SUPPORTED; - } - - if (!s_info.initialized) { - return WIDGET_ERROR_FAULT; - } - - data = get_smart_data(widget); - if (!data) { - ErrPrint("Invalid object\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - EINA_LIST_FOREACH_SAFE(data->preview_list, l, n, info) { - if (info->type == type) { - char *tmp; - - if (preview) { - tmp = strdup(preview); - if (!tmp) { - ErrPrint("strdup: %d\n", errno); - return WIDGET_ERROR_OUT_OF_MEMORY; - } - - free(info->preview); - info->preview = tmp; - return WIDGET_ERROR_NONE; - } - - data->preview_list = eina_list_remove(data->preview_list, info); - free(info->preview); - free(info); - return WIDGET_ERROR_NONE; - } - } - - info = malloc(sizeof(struct preview_info)); - if (!info) { - ErrPrint("malloc: %d\n", errno); - return WIDGET_ERROR_OUT_OF_MEMORY; - } - - info->type = type; - info->preview = strdup(preview); - if (!info->preview) { - ErrPrint("strdup: %d\n", errno); - free(info); - return WIDGET_ERROR_OUT_OF_MEMORY; - } - - data->preview_list = eina_list_append(data->preview_list, info); - return WIDGET_ERROR_NONE; + return WIDGET_ERROR_NOT_SUPPORTED; } EAPI int widget_viewer_evas_hide_overlay(Evas_Object *widget) { - struct widget_data *data; - - if (!is_widget_feature_enabled()) { - return WIDGET_ERROR_NOT_SUPPORTED; - } - - if (!s_info.initialized) { - return WIDGET_ERROR_FAULT; - } - - data = get_smart_data(widget); - if (!data) { - ErrPrint("Invalid object\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (!data->is.field.widget_overlay_loaded) { - /** - * Already disabled - */ - return WIDGET_ERROR_NONE; - } - - if (!data->is.field.hide_overlay_manually) { - DbgPrint("Overlay is not controlled manually\n"); - } - - if (data->overlay_timer) { - ecore_timer_del(data->overlay_timer); - /** - * @note - * data->overlay_timer will be reset'd to NULL by delayed_overlay_disable_cb(). - */ - } - delayed_overlay_disable_cb(data); - - return WIDGET_ERROR_NONE; + return WIDGET_ERROR_NOT_SUPPORTED; } /** @@ -8447,43 +359,7 @@ EAPI int widget_viewer_evas_hide_overlay(Evas_Object *widget) */ EAPI int widget_viewer_evas_hide_faulted_overlay_once(Evas_Object *widget) { - struct widget_data *data; - - if (!is_widget_feature_enabled()) { - return WIDGET_ERROR_NOT_SUPPORTED; - } - - if (!s_info.initialized) { - return WIDGET_ERROR_FAULT; - } - - data = get_smart_data(widget); - if (!data) { - ErrPrint("Invalid object\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - if (data->is.field.faulted == 0) { - ErrPrint("Object is not faulted\n"); - return WIDGET_ERROR_INVALID_PARAMETER; - } - - /** - * @note - * If the overlay (faulted) is already enabled, - * Turn it off first. - */ - if (data->is.field.widget_overlay_loaded) { - DbgPrint("Faulted overlay is disabled\n"); - __widget_overlay_disable(data, 1, 1); - } - - /** - * This flag will be checked before enable the faulted overlay. - * And this will be reset'd right after ignore the faulted overlay. - */ - data->is.field.hide_faulted_overlay = 1; - return WIDGET_ERROR_NONE; + return WIDGET_ERROR_NOT_SUPPORTED; } /* End of a file */ diff --git a/widget_viewer_evas/widget_viewer_evas.pc.in b/widget_viewer_evas/widget_viewer_evas.pc.in index 87ee6a6..a37683b 100644 --- a/widget_viewer_evas/widget_viewer_evas.pc.in +++ b/widget_viewer_evas/widget_viewer_evas.pc.in @@ -6,7 +6,7 @@ includedir=@INCLUDEDIR@ Name: widget_viewer_evas Description: Support development of the widget Viewer EVAS Frontend library Version: @VERSION@ -Requires: widget_service widget_viewer +Requires: widget_service Libs: -L${libdir} -lwidget_viewer_evas Cflags: -I${includedir} cppflags: -I${includedir} -- 2.7.4