From 14437b29105e02031581a779586352e0e9181a56 Mon Sep 17 00:00:00 2001 From: Tanayc Date: Thu, 14 Apr 2016 14:55:10 +0530 Subject: [PATCH] Initialize Recents Change-Id: Ia5be34da8c780d24e1bda1742151410154846482 --- AUTHORS | 2 + CMakeLists.txt | 72 +++ LICENSE | 204 +++++++ NOTICE | 1 + data/org.tizen.task-mgr.efl | 47 ++ data/org.tizen.task-mgr.xml | 11 + include/conf.h | 53 ++ include/item.h | 40 ++ include/list.h | 51 ++ include/log.h | 115 ++++ include/main.h | 41 ++ include/scroller.h | 44 ++ include/util.h | 52 ++ org.tizen.task-mgr.manifest | 11 + packaging/org.tizen.task-mgr.spec | 67 +++ res/CMakeLists.txt | 3 + res/edje/CMakeLists.txt | 17 + res/edje/conf.h | 1 + res/edje/images/clear_all_button_icon.png | Bin 0 -> 3234 bytes res/edje/images/clear_all_button_icon_disable.png | Bin 0 -> 2912 bytes res/edje/item.edc | 294 +++++++++ res/edje/layout.edc | 99 +++ res/images/default.png | Bin 0 -> 57662 bytes res/po/CMakeLists.txt | 23 + res/po/POTFILES.in | 10 + res/po/ar.po | 9 + res/po/as.po | 6 + res/po/az.po | 9 + res/po/bg.po | 9 + res/po/bn.po | 6 + res/po/ca.po | 9 + res/po/cs.po | 9 + res/po/da.po | 9 + res/po/de.po | 9 + res/po/de_DE.po | 36 ++ res/po/el_GR.po | 9 + res/po/en.po | 9 + res/po/en_GB.po | 18 + res/po/en_PH.po | 9 + res/po/en_US.po | 9 + res/po/es_ES.po | 9 + res/po/es_MX.po | 36 ++ res/po/es_US.po | 9 + res/po/et.po | 9 + res/po/eu.po | 9 + res/po/fa.po | 36 ++ res/po/fi.po | 9 + res/po/fr.po | 9 + res/po/fr_CA.po | 9 + res/po/fr_FR.po | 36 ++ res/po/ga.po | 9 + res/po/gl.po | 9 + res/po/gu.po | 6 + res/po/he.po | 18 + res/po/hi.po | 9 + res/po/hr.po | 9 + res/po/hu.po | 9 + res/po/hy.po | 9 + res/po/id.po | 6 + res/po/is.po | 9 + res/po/it_IT.po | 9 + res/po/ja_JP.po | 9 + res/po/ka.po | 9 + res/po/kk.po | 9 + res/po/km.po | 6 + res/po/kn.po | 6 + res/po/ko_KR.po | 6 + res/po/lo.po | 6 + res/po/lt.po | 9 + res/po/lv.po | 9 + res/po/mk.po | 9 + res/po/ml.po | 6 + res/po/mr.po | 6 + res/po/ms.po | 6 + res/po/my.po | 6 + res/po/nb.po | 9 + res/po/ne.po | 6 + res/po/nl.po | 9 + res/po/nl_NL.po | 36 ++ res/po/no.po | 18 + res/po/or.po | 6 + res/po/pa.po | 6 + res/po/pl.po | 9 + res/po/pt_BR.po | 9 + res/po/pt_PT.po | 9 + res/po/ro.po | 9 + res/po/ru_RU.po | 9 + res/po/si.po | 6 + res/po/sk.po | 9 + res/po/sl.po | 9 + res/po/sr.po | 9 + res/po/sv.po | 9 + res/po/ta.po | 6 + res/po/taskmgr.pot | 58 ++ res/po/te.po | 6 + res/po/th.po | 6 + res/po/tl.po | 6 + res/po/tr_TR.po | 9 + res/po/uk.po | 9 + res/po/update-po.sh | 57 ++ res/po/ur.po | 6 + res/po/uz.po | 9 + res/po/vi.po | 6 + res/po/zh_CN.po | 9 + res/po/zh_HK.po | 9 + res/po/zh_SG.po | 36 ++ res/po/zh_TW.po | 9 + src/item.c | 698 ++++++++++++++++++++++ src/list.c | 375 ++++++++++++ src/main.c | 309 ++++++++++ src/scroller.c | 500 ++++++++++++++++ src/util.c | 109 ++++ task-mgr-spin.creator.user | 186 ++++++ 113 files changed, 4393 insertions(+) create mode 100644 AUTHORS create mode 100644 CMakeLists.txt create mode 100755 LICENSE create mode 100755 NOTICE create mode 100644 data/org.tizen.task-mgr.efl create mode 100644 data/org.tizen.task-mgr.xml create mode 100644 include/conf.h create mode 100644 include/item.h create mode 100644 include/list.h create mode 100755 include/log.h create mode 100644 include/main.h create mode 100644 include/scroller.h create mode 100644 include/util.h create mode 100644 org.tizen.task-mgr.manifest create mode 100644 packaging/org.tizen.task-mgr.spec create mode 100644 res/CMakeLists.txt create mode 100644 res/edje/CMakeLists.txt create mode 120000 res/edje/conf.h create mode 100644 res/edje/images/clear_all_button_icon.png create mode 100755 res/edje/images/clear_all_button_icon_disable.png create mode 100644 res/edje/item.edc create mode 100644 res/edje/layout.edc create mode 100644 res/images/default.png create mode 100644 res/po/CMakeLists.txt create mode 100644 res/po/POTFILES.in create mode 100755 res/po/ar.po create mode 100755 res/po/as.po create mode 100755 res/po/az.po create mode 100755 res/po/bg.po create mode 100755 res/po/bn.po create mode 100755 res/po/ca.po create mode 100755 res/po/cs.po create mode 100755 res/po/da.po create mode 100755 res/po/de.po create mode 100644 res/po/de_DE.po create mode 100755 res/po/el_GR.po create mode 100755 res/po/en.po create mode 100644 res/po/en_GB.po create mode 100755 res/po/en_PH.po create mode 100755 res/po/en_US.po create mode 100755 res/po/es_ES.po create mode 100644 res/po/es_MX.po create mode 100755 res/po/es_US.po create mode 100755 res/po/et.po create mode 100755 res/po/eu.po create mode 100644 res/po/fa.po create mode 100755 res/po/fi.po create mode 100755 res/po/fr.po create mode 100755 res/po/fr_CA.po create mode 100644 res/po/fr_FR.po create mode 100755 res/po/ga.po create mode 100755 res/po/gl.po create mode 100755 res/po/gu.po create mode 100644 res/po/he.po create mode 100755 res/po/hi.po create mode 100755 res/po/hr.po create mode 100755 res/po/hu.po create mode 100755 res/po/hy.po create mode 100755 res/po/id.po create mode 100755 res/po/is.po create mode 100755 res/po/it_IT.po create mode 100755 res/po/ja_JP.po create mode 100755 res/po/ka.po create mode 100755 res/po/kk.po create mode 100755 res/po/km.po create mode 100755 res/po/kn.po create mode 100755 res/po/ko_KR.po create mode 100755 res/po/lo.po create mode 100755 res/po/lt.po create mode 100755 res/po/lv.po create mode 100755 res/po/mk.po create mode 100755 res/po/ml.po create mode 100755 res/po/mr.po create mode 100755 res/po/ms.po create mode 100755 res/po/my.po create mode 100755 res/po/nb.po create mode 100755 res/po/ne.po create mode 100755 res/po/nl.po create mode 100644 res/po/nl_NL.po create mode 100644 res/po/no.po create mode 100755 res/po/or.po create mode 100755 res/po/pa.po create mode 100755 res/po/pl.po create mode 100755 res/po/pt_BR.po create mode 100755 res/po/pt_PT.po create mode 100755 res/po/ro.po create mode 100755 res/po/ru_RU.po create mode 100755 res/po/si.po create mode 100755 res/po/sk.po create mode 100755 res/po/sl.po create mode 100755 res/po/sr.po create mode 100755 res/po/sv.po create mode 100755 res/po/ta.po create mode 100644 res/po/taskmgr.pot create mode 100755 res/po/te.po create mode 100755 res/po/th.po create mode 100755 res/po/tl.po create mode 100755 res/po/tr_TR.po create mode 100755 res/po/uk.po create mode 100755 res/po/update-po.sh create mode 100755 res/po/ur.po create mode 100755 res/po/uz.po create mode 100755 res/po/vi.po create mode 100755 res/po/zh_CN.po create mode 100755 res/po/zh_HK.po create mode 100644 res/po/zh_SG.po create mode 100755 res/po/zh_TW.po create mode 100644 src/item.c create mode 100644 src/list.c create mode 100644 src/main.c create mode 100644 src/scroller.c create mode 100644 src/util.c create mode 100644 task-mgr-spin.creator.user diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..566bee7 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,2 @@ +Hong Kwon +Minho Kim diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..4352e27 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,72 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) +PROJECT(task-mgr) +# FIND ALL SOURCE IN A SOURCE DIRECTORY +AUX_SOURCE_DIRECTORY(${CMAKE_SOURCE_DIR}/src SRCS) + +#INCLUDE FILE +INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include) +SET(PACKAGE "${PROJECT_NAME}") +SET(RESOURCE_DIR "${CMAKE_SOURCE_DIR}/res") +SET(EDJDIR "${RESOURCE_DIR}/edje/${PACKAGE}") + +INCLUDE(FindPkgConfig) +pkg_check_modules(pkgs REQUIRED + appcore-efl + evas + edje + elementary + ecore + eina + capi-appfw-application + capi-system-info + capi-appfw-package-manager + capi-appfw-app-manager + dlog + pkgmgr-info + rua + feedback +) + +SET(PREFIX ${CMAKE_INSTALL_PREFIX}) +SET(RESDIR "${PREFIX}/res") +SET(EDJEDIR "${RESDIR}/edje") +SET(LOCALEDIR "${RESDIR}/locale") + +FOREACH(flag ${pkgs_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") +ENDFOREACH(flag) + +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fPIE") +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CFLAGS} -fPIE") + +SET(CMAKE_C_FLAGS_PROFILING "-O0 -g -pg -fPIE") +SET(CMAKE_CXX_FLAGS_PROFILING "-O0 -std=c++0x -g -pg -fPIE") +SET(CMAKE_C_FLAGS_DEBUG "-O0 -g -fPIE") +SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -std=c++0x -g -fPIE") +SET(CMAKE_C_FLAGS_RELEASE "-O2 -g -fPIE") +SET(CMAKE_CXX_FLAGS_RELEASE "-O2 -std=c++0x -g -fPIE") +SET(CMAKE_C_FLAGS_CCOV "-O2 -g --coverage -fPIE") +SET(CMAKE_CXX_FLAGS_CCOV "-O2 -std=c++0x -g --coverage -fPIE") + +SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed -pie") + +MESSAGE(${CMAKE_C_FLAGS}) + +ADD_DEFINITIONS("-DEDJEDIR=\"${EDJEDIR}\"") +ADD_DEFINITIONS("-DLOCALEDIR=\"${LOCALEDIR}\"") + +ADD_EXECUTABLE(${PROJECT_NAME} ${SRCS}) + +TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_LDFLAGS}) + +# Install +INSTALL(TARGETS ${PROJECT_NAME} DESTINATION bin) + +#Install images +INSTALL(DIRECTORY res/images/ DESTINATION res/images) + +# Install Manifest File +INSTALL(FILES data/org.tizen.task-mgr.xml DESTINATION /usr/share/packages) +INSTALL(FILES data/org.tizen.task-mgr.efl DESTINATION /etc/smack/accesses.d) +# End of a file +ADD_SUBDIRECTORY(res) diff --git a/LICENSE b/LICENSE new file mode 100755 index 0000000..54b213e --- /dev/null +++ b/LICENSE @@ -0,0 +1,204 @@ +Copyright (c) 2000 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + 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. + + 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, + 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 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 in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) 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 + + (d) 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. + + 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 Apache License to your work. + + To apply the Apache 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 Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + diff --git a/NOTICE b/NOTICE new file mode 100755 index 0000000..b2e5019 --- /dev/null +++ b/NOTICE @@ -0,0 +1 @@ +Copyright (c) 2000 - 2015 Samsung Electronics Co., Ltd. All rights reserved. diff --git a/data/org.tizen.task-mgr.efl b/data/org.tizen.task-mgr.efl new file mode 100644 index 0000000..26ed423 --- /dev/null +++ b/data/org.tizen.task-mgr.efl @@ -0,0 +1,47 @@ +org.tizen.task-mgr system::homedir rwxat- ------ +org.tizen.task-mgr system::media rwxat- ------ +org.tizen.task-mgr system::share rwxat- ------ +org.tizen.task-mgr system::use_internet r----- ------ +org.tizen.task-mgr system::ext_storage rwxat- ------ +org.tizen.task-mgr secure-storage-client rw---- ------ +org.tizen.task-mgr pulseaudio rwxat- ------ +org.tizen.task-mgr system r-x--- ------ +org.tizen.task-mgr xorg rw---- ------ +org.tizen.task-mgr device::bklight rw---- ------ +org.tizen.task-mgr org.tizen.indicator rwx--- ------ +org.tizen.task-mgr org.tizen.quickpanel rwx--- ------ +org.tizen.task-mgr crash-popup r-x--- ------ +org.tizen.task-mgr system-server rwx--- ------ +org.tizen.task-mgr immvibed rw---- ------ +org.tizen.task-mgr display_wd r-x--- ------ +org.tizen.task-mgr sound_server rwxa-- ------ +org.tizen.task-mgr dbus rwx--- ------ +org.tizen.task-mgr e17 rw---- ------ +org.tizen.task-mgr aul rwx--- ------ +org.tizen.task-mgr aul::launch rwx--- ------ +org.tizen.task-mgr aul::terminate --x--- ------ +org.tizen.task-mgr app-svc rwx--- ------ +org.tizen.task-mgr aul_amd rwx--- ------ +org.tizen.task-mgr pkgmgr::db rwx--- ------ +org.tizen.task-mgr trm -w---- ------ +org.tizen.task-mgr svi-data r-x--- ------ +org.tizen.task-mgr org.tizen.oma-dm r-x--- ------ +org.tizen.task-mgr sys-assert::core rwxat- ------ +org.tizen.task-mgr isf rwx--- ------ +org.tizen.task-mgr media-server r-x--- ------ +org.tizen.task-mgr deviced rwx--- ------ +org.tizen.task-mgr notification::db rw---- ------ +org.tizen.task-mgr data-provider-master rw---- ------ +org.tizen.task-mgr data-provider-master::notification rw---- ------ +org.tizen.task-mgr data-provider-master::notification.client rw---- ------ +org.tizen.task-mgr org.tizen.setting::default-resources r-x--- ------ +org.tizen.task-mgr device::app_logging -w---- ------ +org.tizen.task-mgr device::sys_logging -w---- ------ +org.tizen.task-mgr oma-ds-agent::cfg r----- ------ +org.tizen.task-mgr oma-ds-agent::svc rw---- ------ +org.tizen.task-mgr rua::db rwx--- ------ +org.tizen.indicator org.tizen.task-mgr rwx--- ------ +e17 org.tizen.task-mgr rw---- ------ +system org.tizen.task-mgr -w---- ------ +display_wd org.tizen.task-mgr -w---- ------ +dbus org.tizen.task-mgr rwx--- ------ diff --git a/data/org.tizen.task-mgr.xml b/data/org.tizen.task-mgr.xml new file mode 100644 index 0000000..25c605d --- /dev/null +++ b/data/org.tizen.task-mgr.xml @@ -0,0 +1,11 @@ + + + + Kamil Maslanka + Michal Skorupinski + TASK MANAGER APPLICATION + + + + + diff --git a/include/conf.h b/include/conf.h new file mode 100644 index 0000000..f876075 --- /dev/null +++ b/include/conf.h @@ -0,0 +1,53 @@ +/* + * Task Manager + * + * Copyright (c) 2000 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __TASK_MGR_CONF_H__ +#define __TASK_MGR_CONF_H__ + +//size +#define BASE_WIDTH 720 +#define BASE_HEIGHT 1280 + +#define CLEAR_ICON_WIDTH 60 +#define CLEAR_ICON_HEIGHT 60 +#define CLEAR_LINE_WIDTH 2 +#define CLEAR_LINE_HEIGHT 120 +#define CLEAR_PAD_HEIGHT 100 +#define CLEAR_ITEM_WIDTH CLEAR_ICON_WIDTH +#define CLEAR_ITEM_HEIGHT CLEAR_LINE_HEIGHT+CLEAR_PAD_HEIGHT + +#define ITEM_ICON_WIDTH 118 +#define ITEM_ICON_HEIGHT 118 +#define ITEM_LINE_WIDTH 2 +#define ITEM_LINE_HEIGHT 174 +#define ITEM_WIDTH ITEM_ICON_WIDTH +#define ITEM_HEIGHT ITEM_LINE_HEIGHT + +//color +#define BG_COLOR (255*0.5) + +//edc +#define LAYOUT EDJEDIR"/layout.edj" +#define BOX_LAYOUT EDJEDIR"/box.edj" +#define ITEM_LAYOUT EDJEDIR"/item.edj" + +#define BOX_GROUP_NAME "box" +#define BG_PART_NAME "bg" + +#endif //__TASK_MGR_CONF_H__ diff --git a/include/item.h b/include/item.h new file mode 100644 index 0000000..3d1e7a8 --- /dev/null +++ b/include/item.h @@ -0,0 +1,40 @@ +/* + * Task Manager + * + * Copyright (c) 2000 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __TASK_MGR_ITEM_H__ +#define __TASK_MGR_ITEM_H__ + +#include "list.h" +#include "util.h" + + + +extern list_type_default_s *item_get_info(Evas_Object *item); + +extern void item_clear_set_disable(Evas_Object *scroller); +extern Evas_Object *item_clear_all_create(Evas_Object *scroller); +extern void item_clear_all_destroy(Evas_Object *scroller); + +extern Evas_Object *item_create(Evas_Object *scroller, list_type_default_s *info); +extern void item_destroy(Evas_Object *item); +extern void item_terminate(Evas_Object *item); + + + +#endif //__TASK_MGR_ITEM_H__ diff --git a/include/list.h b/include/list.h new file mode 100644 index 0000000..2d5361e --- /dev/null +++ b/include/list.h @@ -0,0 +1,51 @@ +/* + * Task Manager + * + * Copyright (c) 2000 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __TASK_MGR_LIST_H__ +#define __TASK_MGR_LIST_H__ + +#include "util.h" + +typedef struct { + + char *pkgid; + char *appid; + char *name; + char *icon; + char *arg; + + int pid; + Eina_Bool nodisplay; + Eina_Bool taskmanage; + Eina_Bool unmounted; + Eina_Bool multi_launch; + Eina_Bool isAlreadySet; + + time_t launch_time; + +} list_type_default_s; + + + +extern task_mgr_error_e list_create(Eina_List **pkg_list); +extern void list_destroy(Eina_List *pkg_list); + +extern task_mgr_error_e list_sort(Eina_List *pkg_list, int (*_sort_cb)(const void *d1, const void *d2)); + +#endif //__TASK_MGR_LIST_H__ diff --git a/include/log.h b/include/log.h new file mode 100755 index 0000000..3831fad --- /dev/null +++ b/include/log.h @@ -0,0 +1,115 @@ +/* + * Task Manager + * + * Copyright (c) 2000 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __TASK_MGR_LOG_H__ +#define __TASK_MGR_LOG_H__ + +#include +#include + +#undef LOG_TAG +#define LOG_TAG "TASK_MGR" + +#if !defined(_D) +#define _D(fmt, arg...) LOGD(fmt"\n", ##arg) +#endif + +#if !defined(_W) +#define _W(fmt, arg...) LOGW(fmt"\n", ##arg) +#endif + +#if !defined(_E) +#define _E(fmt, arg...) LOGE(fmt"\n", ##arg) +#endif + +#if !defined(_SD) +#define _SD(fmt, arg...) SECURE_LOGD(fmt"\n", ##arg) +#endif + +#if !defined(_SW) +#define _SW(fmt, arg...) SECURE_LOGW(fmt"\n", ##arg) +#endif + +#if !defined(_SE) +#define _SE(fmt, arg...) SECURE_LOGE(fmt"\n", ##arg) +#endif + +#define retvm_if_timer(timer, expr, val, fmt, arg...) do { \ + if (expr) { \ + _E(fmt, ##arg); \ + _E("(%s) -> %s() return", #expr, __FUNCTION__); \ + timer = NULL; \ + return (val); \ + } \ +} while (0) + +#define retvm_if(expr, val, fmt, arg...) do { \ + if(expr) { \ + _E(fmt, ##arg); \ + _E("(%s) -> %s() return", #expr, __FUNCTION__); \ + return val; \ + } \ +} while (0) + +#define retv_if(expr, val) do { \ + if(expr) { \ + _E("(%s) -> %s() return", #expr, __FUNCTION__); \ + return (val); \ + } \ +} while (0) + +#define retm_if(expr, fmt, arg...) do { \ + if(expr) { \ + _E(fmt, ##arg); \ + _E("(%s) -> %s() return", #expr, __FUNCTION__); \ + return; \ + } \ +} while (0) + +#define ret_if(expr) do { \ + if(expr) { \ + _E("(%s) -> %s() return", #expr, __FUNCTION__); \ + return; \ + } \ +} while (0) + +#define goto_if(expr, val) do { \ + if(expr) { \ + _E("(%s) -> goto", #expr); \ + goto val; \ + } \ +} while (0) + +#define break_if(expr) { \ + if(expr) { \ + _E("(%s) -> break", #expr); \ + break; \ + } \ +} + +#define continue_if(expr) { \ + if(expr) { \ + _E("(%s) -> continue", #expr); \ + continue; \ + } \ +} + + + +#endif //__TASK_MGR_LOG_H__ diff --git a/include/main.h b/include/main.h new file mode 100644 index 0000000..62c9bdd --- /dev/null +++ b/include/main.h @@ -0,0 +1,41 @@ +/* + * Task Manager + * + * Copyright (c) 2000 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __TASK_MGR_H__ +#define __TASK_MGR_H__ + +typedef struct { + Evas *e; + Evas_Object *win; + Evas_Object *bg; + Evas_Object *layout; + Evas_Object *scroller; + Evas_Object *box; + + Eina_List *pkg_list; + + int root_w; + int root_h; +} main_s; +typedef main_s *main_h; + + +extern main_h main_get_info(void); + +#endif //__TASK_MGR_H__ diff --git a/include/scroller.h b/include/scroller.h new file mode 100644 index 0000000..bf67ac9 --- /dev/null +++ b/include/scroller.h @@ -0,0 +1,44 @@ +/* + * Task Manager + * + * Copyright (c) 2000 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __TASK_MGR_SCROLLER_H__ +#define __TASK_MGR_SCROLLER_H__ + +#include "util.h" + + + +extern task_mgr_error_e scroller_push_item(Evas_Object *scroller, Evas_Object *item); +extern void scroller_pop_item(Evas_Object *scroller, Evas_Object *item, int terminate); + +extern task_mgr_error_e scroller_push_all_item(Evas_Object *scroller, Eina_List *list); +extern void scroller_pop_all_item(Evas_Object *scroller, int terminate); + +extern int scroller_count(Evas_Object *scroller); +extern Eina_Bool scroller_is_scrolling(Evas_Object *scroller); + +extern void scroller_freeze(Evas_Object *scroller); +extern void scroller_unfreeze(Evas_Object *scroller); + +extern Evas_Object *scroller_create(Evas_Object *layout); +extern void scroller_destroy(Evas_Object *scroller); + + + +#endif //__TASK_MGR_SCROLLER_H__ diff --git a/include/util.h b/include/util.h new file mode 100644 index 0000000..af2c727 --- /dev/null +++ b/include/util.h @@ -0,0 +1,52 @@ +/* + * Task Manager + * + * Copyright (c) 2000 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + #ifndef __TASK_MGR_UTIL_H__ + #define __TASK_MGR_UTIL_H__ + + + +/* data key */ +#define DATA_KEY_RUNNING_LIST "rn_list" +#define DATA_KEY_IS_SCROLLING "is_scing" +#define DATA_KEY_ITEM_INFO "it_if" + +/* Multi-language */ +#if !defined(_) +#define _(str) gettext(str) +#endif + + + +/* Enum */ +typedef enum { + TASK_MGR_ERROR_NONE = 0, + TASK_MGR_ERROR_FAIL = -1, + TASK_MGR_ERROR_DB_FAILED = -2, + TASK_MGR_ERROR_OUT_OF_MEMORY = -3, + TASK_MGR_ERROR_INVALID_PARAMETER = -4, + TASK_MGR_ERROR_NO_DATA = -5, +} task_mgr_error_e; + +extern Eina_Bool util_kill_app(const char *appid); +extern Eina_Bool util_launch_app(const char *appid); + + + +#endif //__TASK_MGR_UTIL_H__ diff --git a/org.tizen.task-mgr.manifest b/org.tizen.task-mgr.manifest new file mode 100644 index 0000000..9a6888c --- /dev/null +++ b/org.tizen.task-mgr.manifest @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/packaging/org.tizen.task-mgr.spec b/packaging/org.tizen.task-mgr.spec new file mode 100644 index 0000000..ed5119b --- /dev/null +++ b/packaging/org.tizen.task-mgr.spec @@ -0,0 +1,67 @@ +%define Exec task-mgr +%define AppInstallPath /usr/apps/%{name} + +Name: org.tizen.task-mgr +Summary: Taskmanager application +Version: 0.0.1 +Release: 1 +License: Apache-2.0 +Source0: %{name}-%{version}.tar.gz + +%if "%{?tizen_profile_name}" == "wearable" +ExcludeArch: %{arm} %ix86 x86_64 +%endif + +%if "%{?tizen_profile_name}" == "tv" +ExcludeArch: %{arm} %ix86 x86_64 +%endif + +BuildRequires: pkgconfig(appcore-efl) +BuildRequires: pkgconfig(capi-appfw-application) +BuildRequires: pkgconfig(ecore) +BuildRequires: pkgconfig(eina) +BuildRequires: pkgconfig(evas) +BuildRequires: pkgconfig(edje) +BuildRequires: edje-tools +BuildRequires: gettext-tools +BuildRequires: pkgconfig(dlog) +BuildRequires: pkgconfig(elementary) +BuildRequires: pkgconfig(capi-system-info) +BuildRequires: pkgconfig(capi-appfw-package-manager) +BuildRequires: pkgconfig(capi-appfw-app-manager) +BuildRequires: cmake +BuildRequires: pkgconfig(pkgmgr-info) +BuildRequires: pkgconfig(rua) +BuildRequires: pkgconfig(feedback) + +%description +Taskmanager application. + +%prep +%setup -q + +%build +export CFLAGS="$CFLAGS -DTIZEN_DEBUG_ENABLE" +export CXXFLAGS="$CXXFLAGS -DTIZEN_DEBUG_ENABLE" +export FFLAGS="$FFLAGS -DTIZEN_DEBUG_ENABLE" + +cmake . -DCMAKE_INSTALL_PREFIX="%{AppInstallPath}" -DCMAKE_TARGET="%{Exec}" -DCMAKE_PACKAGE="%{name}" +make %{?jobs:-j%jobs} + +%install +rm -rf %{buildroot} +%make_install + +%post +/sbin/ldconfig + +%postun -p /sbin/ldconfig + +%files +%manifest %{name}.manifest +%defattr(-,root,root,-) +%{AppInstallPath}/bin/task-mgr +%{AppInstallPath}/res/* +%{_datarootdir}/packages/%{name}.xml +/etc/smack/accesses.d/%{name}.efl +%{AppInstallPath}/res/locale/*/LC_MESSAGES/* diff --git a/res/CMakeLists.txt b/res/CMakeLists.txt new file mode 100644 index 0000000..5cc2056 --- /dev/null +++ b/res/CMakeLists.txt @@ -0,0 +1,3 @@ +ADD_SUBDIRECTORY(edje) +#ADD_SUBDIRECTORY(images) +ADD_SUBDIRECTORY(po) diff --git a/res/edje/CMakeLists.txt b/res/edje/CMakeLists.txt new file mode 100644 index 0000000..62354db --- /dev/null +++ b/res/edje/CMakeLists.txt @@ -0,0 +1,17 @@ +#install edj +ADD_CUSTOM_TARGET(layout.edj + COMMAND edje_cc -id ${CMAKE_CURRENT_SOURCE_DIR}/images + ${CMAKE_CURRENT_SOURCE_DIR}/layout.edc layout.edj + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/layout.edc +) +ADD_DEPENDENCIES(${PROJECT_NAME} layout.edj) +INSTALL(FILES layout.edj DESTINATION ${EDJEDIR}) + +ADD_CUSTOM_TARGET(item.edj + COMMAND edje_cc -id ${CMAKE_CURRENT_SOURCE_DIR}/images + ${CMAKE_CURRENT_SOURCE_DIR}/item.edc item.edj + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/item.edc +) +ADD_DEPENDENCIES(${PROJECT_NAME} item.edj) +INSTALL(FILES item.edj DESTINATION ${EDJEDIR}) + diff --git a/res/edje/conf.h b/res/edje/conf.h new file mode 120000 index 0000000..de97229 --- /dev/null +++ b/res/edje/conf.h @@ -0,0 +1 @@ +../../include/conf.h \ No newline at end of file diff --git a/res/edje/images/clear_all_button_icon.png b/res/edje/images/clear_all_button_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4ba500c65cf6a655cfa5b55edfe65710f4ecd086 GIT binary patch literal 3234 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 kZ}gYfNaCF}xV$|1>H6z0+kD, YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-11-23 18:20+0900\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: _genlist.c:153 +#, c-format +msgid "IDS_TASKMGR_WARNNING_TERMINATE_ALL_TASKS" +msgstr "" + +#: _genlist.c:170 +#, c-format +msgid "IDS_TASKMGR_ASK_DELETE_ALL_HISTORY" +msgstr "" + +#: _genlist.c:186 +#, c-format +msgid "IDS_TASKMGR_ASK_TERMINATE_TASK" +msgstr "" + +#: _genlist.c:203 +#, c-format +msgid "IDS_TASKMGR_ASK_CLEAR_HISTORY" +msgstr "" + +#: _genlist.c:264 +msgid "IDS_TASKMGR_CANNOT_LAUNCH_APPLICATION" +msgstr "" + +#: _info.c:122 +msgid "IDS_TASKMGR_INFO_MESSAGE" +msgstr "" + +#: _logic.c:150 +msgid "IDS_TASKMGR_HEADER_TASK_SWITCHER" +msgstr "" + +#: _util_efl.c:181 +msgid "Warning!" +msgstr "" + +#: _util_efl.c:184 +msgid "IDS_COM_POP_CANCEL" +msgstr "" diff --git a/res/po/te.po b/res/po/te.po new file mode 100755 index 0000000..b71d74f --- /dev/null +++ b/res/po/te.po @@ -0,0 +1,6 @@ +msgid "IDS_TASKMGR_BUTTON_CLEAR_ALL" +msgstr "అన్ని క్లియర్ చేయి" + +msgid "IDS_TASKMGR_NPBODY_NO_APPLICATIONS_ABB2" +msgstr "అప్లికేషన్‌లు లేవు" + diff --git a/res/po/th.po b/res/po/th.po new file mode 100755 index 0000000..16ec7cd --- /dev/null +++ b/res/po/th.po @@ -0,0 +1,6 @@ +msgid "IDS_TASKMGR_BUTTON_CLEAR_ALL" +msgstr "ลบทั้ง​หมด" + +msgid "IDS_TASKMGR_NPBODY_NO_APPLICATIONS_ABB2" +msgstr "ไม่มีแอพพลิเคชั่น" + diff --git a/res/po/tl.po b/res/po/tl.po new file mode 100755 index 0000000..6ee739a --- /dev/null +++ b/res/po/tl.po @@ -0,0 +1,6 @@ +msgid "IDS_TASKMGR_BUTTON_CLEAR_ALL" +msgstr "I-clear lahat" + +msgid "IDS_TASKMGR_NPBODY_NO_APPLICATIONS_ABB2" +msgstr "Walang mga application" + diff --git a/res/po/tr_TR.po b/res/po/tr_TR.po new file mode 100755 index 0000000..a7297e1 --- /dev/null +++ b/res/po/tr_TR.po @@ -0,0 +1,9 @@ +msgid "IDS_TASKMGR_NPBODY_NO_APPLICATIONS_ABB2" +msgstr "Uygulama yok" + +msgid "IDS_TASKMGR_BUTTON_TASK_MGR_ABB" +msgstr "Grv yntcs" + +msgid "IDS_TASKMGR_BUTTON_CLEAR_ALL" +msgstr "Tümünü sil" + diff --git a/res/po/uk.po b/res/po/uk.po new file mode 100755 index 0000000..7e8d9e3 --- /dev/null +++ b/res/po/uk.po @@ -0,0 +1,9 @@ +msgid "IDS_TASKMGR_NPBODY_NO_APPLICATIONS_ABB2" +msgstr "Немає програм" + +msgid "IDS_TASKMGR_BUTTON_TASK_MGR_ABB" +msgstr "Дис.завд." + +msgid "IDS_TASKMGR_BUTTON_CLEAR_ALL" +msgstr "Очистити все" + diff --git a/res/po/update-po.sh b/res/po/update-po.sh new file mode 100755 index 0000000..1869cbd --- /dev/null +++ b/res/po/update-po.sh @@ -0,0 +1,57 @@ +#!/bin/sh + +PACKAGE=taskmgr +SRCROOT=../src +POTFILES=POTFILES.in + +#ALL_LINGUAS= am az be ca cs da de el en_CA en_GB es et fi fr hr hu it ja ko lv mk ml ms nb ne nl pa pl pt pt_BR ru rw sk sl sr sr@Latn sv ta tr uk vi zh_CN zh_TW +ALL_LINGUAS="en_US en_GB ja ko zh_CN" + +XGETTEXT=/usr/bin/xgettext +MSGMERGE=/usr/bin/msgmerge + +echo -n "Make ${PACKAGE}.pot " +if [ ! -e $POTFILES ] ; then + echo "$POTFILES not found" + exit 1 +fi + +$XGETTEXT --default-domain=${PACKAGE} --directory=${SRCROOT} \ + --add-comments --keyword=_ --keyword=N_ --files-from=$POTFILES \ +&& test ! -f ${PACKAGE}.po \ + || (rm -f ${PACKAGE}.pot && mv ${PACKAGE}.po ${PACKAGE}.pot) + +if [ $? -ne 0 ]; then + echo "error" + exit 1 +else + echo "done" +fi + +for LANG in $ALL_LINGUAS; do + echo "$LANG : " + + if [ ! -e $LANG.po ] ; then + cp ${PACKAGE}.pot ${LANG}.po + echo "${LANG}.po created" + else + if $MSGMERGE ${LANG}.po ${PACKAGE}.pot -o ${LANG}.new.po ; then + if cmp ${LANG}.po ${LANG}.new.po > /dev/null 2>&1; then + rm -f ${LANG}.new.po + else + if mv -f ${LANG}.new.po ${LANG}.po; then + echo "" + else + echo "msgmerge for $LANG.po failed: cannot move $LANG.new.po to $LANG.po" 1>&2 + rm -f ${LANG}.new.po + exit 1 + fi + fi + else + echo "msgmerge for $LANG failed!" + rm -f ${LANG}.new.po + fi + fi + echo "" +done + diff --git a/res/po/ur.po b/res/po/ur.po new file mode 100755 index 0000000..259dd69 --- /dev/null +++ b/res/po/ur.po @@ -0,0 +1,6 @@ +msgid "IDS_TASKMGR_BUTTON_CLEAR_ALL" +msgstr "سب صاف کریں" + +msgid "IDS_TASKMGR_NPBODY_NO_APPLICATIONS_ABB2" +msgstr "کوئی ایپلیکیشنز نہیں" + diff --git a/res/po/uz.po b/res/po/uz.po new file mode 100755 index 0000000..60438bd --- /dev/null +++ b/res/po/uz.po @@ -0,0 +1,9 @@ +msgid "IDS_TASKMGR_NPBODY_NO_APPLICATIONS_ABB2" +msgstr "Ilovalar yo‘q" + +msgid "IDS_TASKMGR_BUTTON_TASK_MGR_ABB" +msgstr "Vaz. mnjr" + +msgid "IDS_TASKMGR_BUTTON_CLEAR_ALL" +msgstr "Barini tozala" + diff --git a/res/po/vi.po b/res/po/vi.po new file mode 100755 index 0000000..ca4578b --- /dev/null +++ b/res/po/vi.po @@ -0,0 +1,6 @@ +msgid "IDS_TASKMGR_BUTTON_CLEAR_ALL" +msgstr "Xóa tất cả" + +msgid "IDS_TASKMGR_NPBODY_NO_APPLICATIONS_ABB2" +msgstr "Không có ứng dụng" + diff --git a/res/po/zh_CN.po b/res/po/zh_CN.po new file mode 100755 index 0000000..369f1e0 --- /dev/null +++ b/res/po/zh_CN.po @@ -0,0 +1,9 @@ +msgid "IDS_TASKMGR_NPBODY_NO_APPLICATIONS_ABB2" +msgstr "无应用程序" + +msgid "IDS_TASKMGR_BUTTON_TASK_MGR_ABB" +msgstr "任务管理器" + +msgid "IDS_TASKMGR_BUTTON_CLEAR_ALL" +msgstr "全部清除" + diff --git a/res/po/zh_HK.po b/res/po/zh_HK.po new file mode 100755 index 0000000..3486f99 --- /dev/null +++ b/res/po/zh_HK.po @@ -0,0 +1,9 @@ +msgid "IDS_TASKMGR_NPBODY_NO_APPLICATIONS_ABB2" +msgstr "無應用程式" + +msgid "IDS_TASKMGR_BUTTON_TASK_MGR_ABB" +msgstr "工作管理員" + +msgid "IDS_TASKMGR_BUTTON_CLEAR_ALL" +msgstr "全部清除" + diff --git a/res/po/zh_SG.po b/res/po/zh_SG.po new file mode 100644 index 0000000..19088c5 --- /dev/null +++ b/res/po/zh_SG.po @@ -0,0 +1,36 @@ +msgid "IDS_TASKMGR_BUTTON_CLEAR_HISTORY_ABB" +msgstr "清除历史" + +msgid "IDS_TASKMGR_BUTTON_CLOSE_ALL_APPLICATIONS" +msgstr "关闭所有应用程序" + +msgid "IDS_TASKMGR_HEADER_RUNNING" +msgstr "正在运行" + +msgid "IDS_TASKMGR_MBODY_NO_APPS_OPEN" +msgstr "无开启应用程序" + +msgid "IDS_TASKMGR_MBODY_NO_RECENTLY_USED_APPS" +msgstr "无最近使用的应用程序" + +msgid "IDS_TASKMGR_MBODY_RECENTLY_USED" +msgstr "最近使用" + +msgid "IDS_TASKMGR_POP_CLEAR_ALL_APP_HISTORY_Q" +msgstr "是否清除所有应用程序历史?" + +msgid "IDS_TASKMGR_POP_CLEAR_PS_HISTORY_Q" +msgstr "是否清除 %s 历史?" + +msgid "IDS_TASKMGR_POP_CLOSE_ALL_APPS_Q_THIS_MAY_CAUSE_DATA_TO_BE_LOST" +msgstr "是否关闭所有应用程序?这可能导致数据丢失" + +msgid "IDS_TASKMGR_POP_CLOSE_PS_APP_Q_THIS_MAY_CAUSE_DATA_TO_BE_LOST" +msgstr "是否关闭 %s 应用程序?这可能导致数据丢失" + +msgid "IDS_TASKMGR_POP_UNABLE_TO_OPEN_APPLICATION" +msgstr "无法打开应用程序" + +msgid "IDS_TASKMGR_HEADER_TASK_SWITCHER" +msgstr "任务切换器" + diff --git a/res/po/zh_TW.po b/res/po/zh_TW.po new file mode 100755 index 0000000..3486f99 --- /dev/null +++ b/res/po/zh_TW.po @@ -0,0 +1,9 @@ +msgid "IDS_TASKMGR_NPBODY_NO_APPLICATIONS_ABB2" +msgstr "無應用程式" + +msgid "IDS_TASKMGR_BUTTON_TASK_MGR_ABB" +msgstr "工作管理員" + +msgid "IDS_TASKMGR_BUTTON_CLEAR_ALL" +msgstr "全部清除" + diff --git a/src/item.c b/src/item.c new file mode 100644 index 0000000..af78e57 --- /dev/null +++ b/src/item.c @@ -0,0 +1,698 @@ +/* + * Task Manager + * + * Copyright (c) 2000 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include +#include +#include + +#include "conf.h" +#include "item.h" +#include "list.h" +#include "log.h" +#include "main.h" +#include "scroller.h" +#include "util.h" + +#define PRIVATE_DATA_KEY_CLEAR "p_clr" +#define PRIVATE_DATA_KEY_NEXT_ITEM "p_n_it" +#define PRIVATE_DATA_KEY_ITEM_INNER_FOR_MOVING "p_in_mv" +#define PRIVATE_DATA_KEY_ITEM_ANIM_FOR_MOVING "p_an_mv" +#define PRIVATE_DATA_KEY_ITEM_X "p_it_x" +#define PRIVATE_DATA_KEY_ITEM_Y "p_it_y" +#define PRIVATE_DATA_KEY_ITEM_W "p_it_w" +#define PRIVATE_DATA_KEY_ITEM_H "p_it_h" +#define PRIVATE_DATA_KEY_DOWN_X "p_dw_x" +#define PRIVATE_DATA_KEY_DOWN_Y "p_dw_y" +#define PRIVATE_DATA_KEY_DOWN_TIME "p_dw_t" +#define PRIVATE_DATA_KEY_SCROLLED "p_sc" +#define PRIVATE_DATA_KEY_PRESSED "p_pre" +#define PRIVATE_DATA_KEY_ITEM_MOVED "p_it_mv" + +#define PRIVATE_MOVE_THRESHOLD 30 +#define PRIVATE_FLICK_TIME 100 +#define PRIVATE_ITEM_TERMINATE_THRESHOLD 2.0 +#define PRIVATE_ITEM_ALPHA 0.8 +#define PRIVATE_ITEM_ALPHA_MAX 100 + + + +extern list_type_default_s *item_get_info(Evas_Object *item) +{ + retv_if(!item, NULL); + list_type_default_s *info = NULL; + + info = evas_object_data_get(item, DATA_KEY_ITEM_INFO); + + return info; +} + + + +extern void item_clear_set_disable(Evas_Object *scroller) +{ + Evas_Object *clear_item = NULL; + ret_if(!scroller); + + clear_item = evas_object_data_get(scroller, PRIVATE_DATA_KEY_CLEAR); + ret_if(!clear_item); + elm_layout_signal_emit(main_get_info()->layout, "no,apps,txt,show", "no,apps,txt"); + elm_layout_signal_emit(clear_item, "no,apps", "clear"); + +} + + + +static void _clear_all_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + Evas_Object *scroller = data; + ret_if(!scroller); + _D("clear all item is clicked"); + scroller_pop_all_item(scroller, 1); +} + + + +extern Evas_Object *item_clear_all_create(Evas_Object *scroller) +{ + retv_if(!scroller, NULL); + + Evas_Object *clear_item = NULL; + + clear_item = elm_layout_add(scroller); + retv_if(!clear_item, NULL); + + if (!elm_layout_file_set(clear_item, ITEM_LAYOUT, "clear_item")) { + _E("Failed to set the layout"); + evas_object_del(clear_item); + return NULL; + } + + elm_object_part_text_set(clear_item, "name", _("IDS_TASKMGR_BUTTON_CLEAR_ALL")); + + elm_object_signal_callback_add(clear_item, "mouse,clicked,1", "event", _clear_all_clicked_cb, scroller); + evas_object_data_set(scroller, PRIVATE_DATA_KEY_CLEAR, clear_item); + + evas_object_size_hint_weight_set(clear_item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(clear_item); + + return clear_item; + +} + + + +extern void item_clear_all_destroy(Evas_Object *scroller) +{ + ret_if(!scroller); + + Evas_Object *clear_item = NULL; + + clear_item = evas_object_data_del(scroller, PRIVATE_DATA_KEY_CLEAR); + if (clear_item) evas_object_del(clear_item); +} + + + +static Evas_Object *_content_set_item_inner(Evas_Object *item_outer) +{ + Evas_Object *box = NULL; + Evas_Object *item_inner = NULL; + Evas_Object *next_item = NULL; + + box = main_get_info()->box; + retv_if(!box, NULL); + + item_inner = evas_object_data_get(item_outer, PRIVATE_DATA_KEY_ITEM_INNER_FOR_MOVING); + retv_if(!item_inner, NULL); + + next_item = evas_object_data_del(item_outer, PRIVATE_DATA_KEY_NEXT_ITEM); + + elm_box_unpack(box, item_outer); + elm_object_part_content_set(item_outer, "inner", item_inner); + + if (!next_item) { + elm_box_pack_end(box, item_outer); + } else { + elm_box_pack_before(box, item_outer, next_item); + } + return item_outer; +} + + + +static Evas_Object *_content_unset_item_inner(Evas_Object *item_outer) +{ + Evas_Object *box = NULL; + Evas_Object *item_inner = NULL; + Evas_Object *tmp_item = NULL; + Eina_List *list = NULL; + const Eina_List *l = NULL; + const Eina_List *ln = NULL; + + + box = main_get_info()->box; + retv_if(!box, NULL); + + item_inner = elm_object_part_content_unset(item_outer, "inner"); + retv_if(!item_inner, NULL); + evas_object_data_set(item_outer, PRIVATE_DATA_KEY_ITEM_INNER_FOR_MOVING, item_inner); + + list = elm_box_children_get(box); + retv_if(!list, NULL); + + EINA_LIST_FOREACH_SAFE(list, l, ln, tmp_item) { + if (item_outer != tmp_item) continue; + Evas_Object *next_item = eina_list_data_get(ln); + evas_object_data_set(item_outer, PRIVATE_DATA_KEY_NEXT_ITEM, next_item); + break; + } + eina_list_free(list); + + return item_outer; +} + + + +#define ANIM_RATE 5 +#define ANIM_RATE_SPARE ANIM_RATE - 1 +static Eina_Bool _anim_move_item(void *data) +{ + Evas_Object *scroller = NULL; + Evas_Object *item_inner = NULL; + Evas_Object *item_outer = NULL; + + int cur_x, cur_y; + int end_x, end_y; + int end_pos, cur_pos; + int vec_pos; + + item_outer = data; + goto_if(!data, ERROR); + + scroller = main_get_info()->scroller; + goto_if(!scroller, ERROR); + + item_inner = evas_object_data_get(item_outer, PRIVATE_DATA_KEY_ITEM_INNER_FOR_MOVING); + goto_if(!item_inner, ERROR); + + evas_object_geometry_get(item_inner, &cur_x, &cur_y, NULL, NULL); + evas_object_geometry_get(item_outer, &end_x, &end_y, NULL, NULL); + + end_pos = end_x; + vec_pos = (end_x - cur_x)/ANIM_RATE; + cur_x += vec_pos; + cur_pos = cur_x; + + if ((end_pos - cur_pos) < 0) { // Move : Right -> Left + evas_object_move(item_inner, cur_x, cur_y); + int alp = 255 - ((cur_pos - end_pos) * PRIVATE_ITEM_ALPHA) - 1; + if (alp < PRIVATE_ITEM_ALPHA_MAX) alp = PRIVATE_ITEM_ALPHA_MAX; + evas_object_color_set(item_inner, alp, alp, alp, alp); + + if (cur_pos - ANIM_RATE_SPARE <= end_pos) { + evas_object_move(item_inner, end_x, end_y); + goto_if (! _content_set_item_inner(item_outer), ERROR); + /* unfreeze the scroller after setting the content */ + scroller_unfreeze(scroller); + evas_object_data_del(item_outer, PRIVATE_DATA_KEY_ITEM_INNER_FOR_MOVING); + evas_object_data_del(item_outer, PRIVATE_DATA_KEY_ITEM_ANIM_FOR_MOVING); + return ECORE_CALLBACK_CANCEL; + } + } + else { // Move : Left -> Right + evas_object_move(item_inner, cur_x, cur_y); + int alp = 255 - ((end_pos - cur_pos) * PRIVATE_ITEM_ALPHA) - 1; + if (alp < PRIVATE_ITEM_ALPHA_MAX) alp = PRIVATE_ITEM_ALPHA_MAX; + evas_object_color_set(item_inner, alp, alp, alp, alp); + + if (cur_pos + ANIM_RATE_SPARE >= end_pos) { + evas_object_move(item_inner, end_x, end_y); + goto_if (NULL == _content_set_item_inner(item_outer), ERROR); + /* unfreeze the scroller after setting the content */ + scroller_unfreeze(scroller); + evas_object_data_del(item_outer, PRIVATE_DATA_KEY_ITEM_INNER_FOR_MOVING); + evas_object_data_del(item_outer, PRIVATE_DATA_KEY_ITEM_ANIM_FOR_MOVING); + return ECORE_CALLBACK_CANCEL; + } + } + return ECORE_CALLBACK_RENEW; + +ERROR: + if (item_outer) { + scroller_unfreeze(scroller); + evas_object_data_del(item_outer, PRIVATE_DATA_KEY_ITEM_INNER_FOR_MOVING); + evas_object_data_del(item_outer, PRIVATE_DATA_KEY_ITEM_ANIM_FOR_MOVING); + } + return ECORE_CALLBACK_CANCEL; +} + + + +#define SLIPPED_LENGTH 40 +static Eina_Bool _anim_slipped_item(void *data) +{ + Evas_Object *scroller = NULL; + Evas_Object *item_outer = data; + + int item_outer_w, item_outer_h; + + goto_if(!item_outer, ERROR); + + scroller = main_get_info()->scroller; + goto_if(!scroller, ERROR); + + item_outer_w = (int)evas_object_data_get(item_outer, PRIVATE_DATA_KEY_ITEM_W); + item_outer_h = (int)evas_object_data_get(item_outer, PRIVATE_DATA_KEY_ITEM_H); + + item_outer_h -= SLIPPED_LENGTH; + evas_object_size_hint_min_set(item_outer, ELM_SCALE_SIZE(item_outer_w), ELM_SCALE_SIZE(item_outer_h)); + evas_object_data_set(item_outer, PRIVATE_DATA_KEY_ITEM_H, (void *)item_outer_h); + + if (item_outer_h <= 0) { + scroller_pop_item(scroller, item_outer, 1); + + if (scroller_count(scroller) < 2) { + item_clear_set_disable(scroller); + } + goto ERROR; + } + + return ECORE_CALLBACK_RENEW; + +ERROR: + if (item_outer) { + evas_object_data_del(item_outer, PRIVATE_DATA_KEY_ITEM_W); + evas_object_data_del(item_outer, PRIVATE_DATA_KEY_ITEM_H); + evas_object_data_del(item_outer, PRIVATE_DATA_KEY_ITEM_ANIM_FOR_MOVING); + } + return ECORE_CALLBACK_CANCEL; +} + + + +#define TERMINATE_LENGTH 60 +static Eina_Bool _anim_terminate_item(void *data) +{ + Evas_Object *item_outer = data; + Evas_Object *item_inner = NULL; + + int item_x, item_y, item_w, item_h, is_boundary = 0; + int outer_x, outer_y; + + goto_if(!item_outer, ERROR); + + item_inner = evas_object_data_get(item_outer, PRIVATE_DATA_KEY_ITEM_INNER_FOR_MOVING); + if(!item_inner) { + item_inner = elm_object_part_content_unset(item_outer, "inner"); + retv_if(!item_inner, ECORE_CALLBACK_CANCEL); + evas_object_data_set(item_outer, PRIVATE_DATA_KEY_ITEM_INNER_FOR_MOVING, item_inner); + } + + evas_object_geometry_get(item_inner, &item_x, &item_y, &item_w, &item_h); + evas_object_geometry_get(item_outer, &outer_x, &outer_y, NULL, NULL); + + if (item_x >= outer_x) { + item_x += TERMINATE_LENGTH; + } else { + item_x -= TERMINATE_LENGTH; + } + + if (item_x >= main_get_info()->root_w || (item_x + item_w) <= 0) { + is_boundary = 1; + } + + evas_object_move(item_inner, item_x, item_y); + + if (is_boundary) { + Evas_Object *scroller = NULL; + Ecore_Animator *anim = NULL; + + scroller = main_get_info()->scroller; + goto_if(!scroller, ERROR); + + /* unfreeze the scroller after setting the content */ + scroller_unfreeze(scroller); + evas_object_data_del(item_outer, PRIVATE_DATA_KEY_ITEM_INNER_FOR_MOVING); + evas_object_data_del(item_outer, PRIVATE_DATA_KEY_ITEM_ANIM_FOR_MOVING); + evas_object_color_set(item_inner, 255, 255, 255, 0); + elm_object_part_content_set(item_outer, "inner", item_inner); + + anim = evas_object_data_get(item_outer, PRIVATE_DATA_KEY_ITEM_ANIM_FOR_MOVING); + if (anim) { + ecore_animator_del(anim); + anim = NULL; + evas_object_data_del(item_outer, PRIVATE_DATA_KEY_ITEM_ANIM_FOR_MOVING); + } + anim = ecore_animator_add(_anim_slipped_item, item_outer); + goto_if(!anim, ERROR); + evas_object_data_set(item_outer, PRIVATE_DATA_KEY_ITEM_ANIM_FOR_MOVING, anim); + return ECORE_CALLBACK_CANCEL; + } + return ECORE_CALLBACK_RENEW; + +ERROR: + if (item_outer) { + evas_object_data_del(item_outer, PRIVATE_DATA_KEY_ITEM_INNER_FOR_MOVING); + evas_object_data_del(item_outer, PRIVATE_DATA_KEY_ITEM_ANIM_FOR_MOVING); + } + return ECORE_CALLBACK_CANCEL; +} + + + +static void _down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Down *ei = event_info; + Evas_Object *item_outer = data; + Evas_Object *item_inner = NULL; + + int x = ei->output.x; + int y = ei->output.y; + int down_time = ei->timestamp; + int rect_x, rect_y, rect_w, rect_h; + + ret_if(!item_outer); + + _D("Down (%d, %d)", x, y); + + item_inner = elm_object_part_content_get(item_outer, "inner"); + if (!item_inner) { + item_inner = evas_object_data_del(item_outer, PRIVATE_DATA_KEY_ITEM_INNER_FOR_MOVING); + ret_if(!item_inner); + elm_object_part_content_set(item_outer, "inner", item_inner); + } + + evas_object_data_set(item_outer, PRIVATE_DATA_KEY_PRESSED, (void *) 1); + evas_object_data_set(item_outer, PRIVATE_DATA_KEY_DOWN_X, (void *) x); + evas_object_data_set(item_outer, PRIVATE_DATA_KEY_DOWN_Y, (void *) y); + evas_object_data_set(item_outer, PRIVATE_DATA_KEY_DOWN_TIME, (void *)down_time); + + evas_object_geometry_get(item_outer, &rect_x, &rect_y, &rect_w, &rect_h); + evas_object_data_set(item_outer, PRIVATE_DATA_KEY_ITEM_X, (void *) rect_x); + evas_object_data_set(item_outer, PRIVATE_DATA_KEY_ITEM_Y, (void *) rect_y); + evas_object_data_set(item_outer, PRIVATE_DATA_KEY_ITEM_W, (void *) rect_w); + evas_object_data_set(item_outer, PRIVATE_DATA_KEY_ITEM_H, (void *) rect_h); +} + + + +#define LAUNCHING_LENGTH 60 +#define SCROLLER_THRESHOLD 15 +static void _move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Move *ei = event_info; + Evas_Object *item_outer = data; + + Evas_Object *layout = NULL; + Evas_Object *item_inner = NULL; + Evas_Object *scroller = NULL; + Ecore_Animator *anim = NULL; + + int down_x, down_y; + int outer_x, outer_y; + int cur_x, cur_y, vec_x, vec_y; + int alpha = 0; + + if (!item_outer) return; + if (!evas_object_data_get(item_outer, PRIVATE_DATA_KEY_PRESSED)) return; + + scroller = main_get_info()->scroller; + ret_if(!scroller); + if (scroller_is_scrolling(scroller)) { + evas_object_data_set(item_outer, PRIVATE_DATA_KEY_SCROLLED, (void *)1); + evas_object_data_del(item_outer, PRIVATE_DATA_KEY_PRESSED); + + return; + } + + layout = main_get_info()->layout; + ret_if(!layout); + + anim = evas_object_data_get(item_outer, PRIVATE_DATA_KEY_ITEM_ANIM_FOR_MOVING); + if (anim) return; + + down_x = (int) evas_object_data_get(item_outer, PRIVATE_DATA_KEY_DOWN_X); + down_y = (int) evas_object_data_get(item_outer, PRIVATE_DATA_KEY_DOWN_Y); + + outer_x = (int)evas_object_data_get(item_outer, PRIVATE_DATA_KEY_ITEM_X); + outer_y = (int)evas_object_data_get(item_outer, PRIVATE_DATA_KEY_ITEM_Y); + + cur_x = ei->cur.output.x; + cur_y = ei->cur.output.y; + + vec_x = cur_x - down_x; + vec_y = cur_y - down_y; + + outer_x += vec_x; + + if (!evas_object_data_get(item_outer, PRIVATE_DATA_KEY_ITEM_MOVED)) { + if (abs(vec_y) > abs(vec_x) + SCROLLER_THRESHOLD) { + evas_object_data_set(item_outer, PRIVATE_DATA_KEY_SCROLLED, (void *)1); + return; + } + if (abs(vec_x) <= PRIVATE_MOVE_THRESHOLD) return; + if (abs(vec_y) >= SCROLLER_THRESHOLD) return; + } + + evas_object_data_set(item_outer, PRIVATE_DATA_KEY_ITEM_MOVED, (void *) 1); + item_inner = evas_object_data_get(item_outer, PRIVATE_DATA_KEY_ITEM_INNER_FOR_MOVING); + if (!item_inner) { + /* freeze the scroller before unsetting the content */ + scroller_freeze(scroller); + ret_if(!_content_unset_item_inner(item_outer)); + } + + alpha = 255 -(abs(vec_x) * PRIVATE_ITEM_ALPHA); + if (alpha < PRIVATE_ITEM_ALPHA_MAX) { + alpha = PRIVATE_ITEM_ALPHA_MAX; + } + + evas_object_color_set(item_inner, alpha, alpha, alpha, alpha); + evas_object_move(item_inner, outer_x, outer_y); +} + + + +static void _item_terminate_anim(Evas_Object *item_outer) +{ + Ecore_Animator *anim = NULL; + + anim = evas_object_data_get(item_outer, PRIVATE_DATA_KEY_ITEM_ANIM_FOR_MOVING); + if (anim) { + ecore_animator_del(anim); + anim = NULL; + evas_object_data_del(item_outer, PRIVATE_DATA_KEY_ITEM_ANIM_FOR_MOVING); + } + + anim = ecore_animator_add(_anim_terminate_item, item_outer); + ret_if(!anim); + evas_object_data_set(item_outer, PRIVATE_DATA_KEY_ITEM_ANIM_FOR_MOVING, anim); +} + + + +static void _up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Up *ei = event_info; + Evas_Object *item_outer = data; + + Evas_Object *scroller = NULL; + + int x = ei->output.x; + int y = ei->output.y; + int up_time = ei->timestamp; + int down_time = 0; + int init_pos, item_pos, item_size, tm_threshold; + + _D("Up (%d, %d)", x, y); + + ret_if (!item_outer); + + scroller = main_get_info()->scroller; + ret_if(!scroller); + + evas_object_data_del(item_outer, PRIVATE_DATA_KEY_PRESSED); + evas_object_data_del(item_outer, PRIVATE_DATA_KEY_DOWN_Y); + evas_object_data_del(item_outer, PRIVATE_DATA_KEY_DOWN_X); + evas_object_data_del(item_outer, PRIVATE_DATA_KEY_ITEM_MOVED); + evas_object_data_del(item_outer, PRIVATE_DATA_KEY_SCROLLED); + + down_time = (int) evas_object_data_del(item_outer, PRIVATE_DATA_KEY_DOWN_TIME); + + /* This means the inner item has not been moved */ + Evas_Object *item_inner = evas_object_data_get(item_outer, PRIVATE_DATA_KEY_ITEM_INNER_FOR_MOVING); + if (!item_inner) return; + + init_pos = (int) evas_object_data_del(item_outer, PRIVATE_DATA_KEY_ITEM_X); + evas_object_data_del(item_outer, PRIVATE_DATA_KEY_ITEM_Y); + evas_object_geometry_get(item_inner, &item_pos, NULL, &item_size, NULL); + tm_threshold = item_size * PRIVATE_ITEM_TERMINATE_THRESHOLD; + + if (abs(item_pos - init_pos) > tm_threshold || (up_time - down_time < PRIVATE_FLICK_TIME && abs(item_pos - init_pos) > 0)) { + _item_terminate_anim(item_outer); + + } else if (item_pos != init_pos) { + Ecore_Animator *anim = NULL; + anim = evas_object_data_get(item_outer, PRIVATE_DATA_KEY_ITEM_ANIM_FOR_MOVING); + if (anim) { + ecore_animator_del(anim); + anim = NULL; + evas_object_data_del(item_outer, PRIVATE_DATA_KEY_ITEM_ANIM_FOR_MOVING); + } + + anim = ecore_animator_add(_anim_move_item, item_outer); + ret_if(NULL == anim); + evas_object_data_set(item_outer, PRIVATE_DATA_KEY_ITEM_ANIM_FOR_MOVING, anim); + } +} + + + +static void _clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + _D("Clicked"); + + ret_if(!data); + Evas_Object *item = data; + Evas_Object *item_inner = NULL; + + const char *appid = NULL; + + list_type_default_s *info = NULL; + + item_inner = elm_object_part_content_get(item, "inner"); + if (!item_inner) return; + + info = item_get_info(item); + ret_if(!info); + + appid = info->appid; + ret_if(!appid); + + elm_object_signal_emit(item_inner, "clicked", "event"); + + util_launch_app(appid); + //layout_hide_with_timer(); +} + + + +extern Evas_Object *item_create(Evas_Object *scroller, list_type_default_s *info) +{ + retv_if(NULL == scroller, NULL); + retv_if(NULL == info, NULL); + + Evas_Object *icon = NULL; + Evas_Object *item = NULL; + Evas_Object *item_inner = NULL; + + item = elm_layout_add(scroller); + retv_if(NULL == item, NULL); + elm_layout_file_set(item, ITEM_LAYOUT, "item"); + evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(item); + + item_inner = elm_layout_add(scroller); + goto_if(NULL == item_inner, ERROR); + elm_layout_file_set(item_inner, ITEM_LAYOUT, "item_inner"); + evas_object_size_hint_weight_set(item_inner, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(item_inner); + elm_object_part_content_set(item, "inner", item_inner); + evas_object_event_callback_add(item_inner, EVAS_CALLBACK_MOUSE_DOWN, _down_cb, item); + evas_object_event_callback_add(item_inner, EVAS_CALLBACK_MOUSE_MOVE, _move_cb, item); + evas_object_event_callback_add(item_inner, EVAS_CALLBACK_MOUSE_UP, _up_cb, item); + + icon = evas_object_image_add(main_get_info()->e); + goto_if(NULL == icon, ERROR); + evas_object_image_file_set(icon, info->icon, NULL); + evas_object_image_filled_set(icon, EINA_TRUE); + evas_object_show(icon); + elm_object_part_content_set(item_inner, "icon", icon); + elm_object_part_text_set(item_inner, "name", info->name); + + elm_object_signal_callback_add(item_inner, "mouse,clicked,1", "event", _clicked_cb, item); + + evas_object_data_set(item, DATA_KEY_ITEM_INFO, info); + + return item; + +ERROR: + item_destroy(item); + return NULL; +} + + + +extern void item_destroy(Evas_Object *item) +{ + ret_if(!item); + + Evas_Object *icon = NULL; + Evas_Object *item_inner = NULL; + + item_inner = elm_object_part_content_unset(item, "inner"); + if (!item_inner) { + _E("cannot get the object"); + evas_object_del(item); + return; + } + + icon = elm_object_part_content_unset(item_inner, "icon"); + if (icon) { + evas_object_del(icon); + } else { + _E("cannot get the object"); + } + + evas_object_data_del(item, DATA_KEY_ITEM_INFO); + + evas_object_del(item_inner); + evas_object_del(item); +} + + + +extern void item_terminate(Evas_Object *item) +{ + char *appid = NULL; + int ret; + bool running = false; + + ret_if(!item); + ret_if(!item_get_info(item)); + appid = item_get_info(item)->appid; + ret_if(!appid); + + ret = app_manager_is_running(appid, &running); + ret_if(APP_MANAGER_ERROR_NONE != ret); + + _D("Terminate: %s(%d)", appid, running); + if (running) { + util_kill_app(appid); + } + + if (0 != rua_delete_history_with_pkgname(appid)) { + _E("Cannot delete history for package(%s)", appid); + } +} + + + +//End of a file diff --git a/src/list.c b/src/list.c new file mode 100644 index 0000000..43bc501 --- /dev/null +++ b/src/list.c @@ -0,0 +1,375 @@ +/* + * Task Manager + * + * Copyright (c) 2000 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include +#include + +#include "list.h" +#include "log.h" +#include "main.h" +#include "util.h" + +typedef struct pkginfo { + char *appid; + bool taskmanage; + char *pkgid; + char *icon; + char *name; + bool nodisplay; +} private_pkginfo_s; + +typedef struct { + char *appid; + int pid; +} private_pid_s; + +static struct { + Eina_Hash *pkginfo_table; +} private_table_s = { + .pkginfo_table = NULL, +}; + + + +static void _pkglist_unretrieve_item(list_type_default_s *default_info) +{ + if (!default_info) { + return; + } + + if (default_info->name) { + free(default_info->name); + default_info->name = NULL; + } + if (default_info->icon) { + free(default_info->icon); + default_info->icon = NULL; + } + if (default_info->pkgid) { + free(default_info->pkgid); + default_info->pkgid = NULL; + } + if (default_info->arg) { + free(default_info->arg); + default_info->arg = NULL; + } + if (default_info->appid) { + free(default_info->appid); + default_info->appid = NULL; + } + if (default_info) { + free(default_info); + default_info = NULL; + } +} + + + +static list_type_default_s *_pkglist_retrieve_item(const char *appid, const char *arg, time_t launch_time) +{ + retv_if(!appid, NULL); + + private_pkginfo_s *pkg_info = NULL; + list_type_default_s *default_info = NULL; + + pkg_info = eina_hash_find(private_table_s.pkginfo_table, appid); + if (!pkg_info) { + _D("app(%s) is not taskmanage app", appid); + return NULL; + } + + if (!pkg_info->taskmanage) { + _D("app(%s) is not taskmanage app", appid); + return NULL; + } + + default_info = calloc(1, sizeof(*default_info)); + retv_if(!default_info, NULL); + + default_info->taskmanage = pkg_info->taskmanage; + default_info->launch_time = launch_time; + default_info->nodisplay = pkg_info->nodisplay; + + default_info->appid = strdup(appid); + goto_if(!default_info->appid, ERROR); + + if (arg) { + default_info->arg = strdup(arg); + goto_if(!default_info->arg, ERROR); + } + + if (pkg_info->pkgid) { + default_info->pkgid = strdup(pkg_info->pkgid); + goto_if(!default_info->pkgid, ERROR); + } else { + _E("Fail to get pkgid from pkg info table"); + goto ERROR; + } + + if (pkg_info->icon) { + default_info->icon = strdup(pkg_info->icon); + goto_if(!default_info->icon, ERROR); + } else { + _E("Fail to get icon from pkg info table"); + goto ERROR; + } + + if (pkg_info->name) { + default_info->name = strdup(pkg_info->name); + goto_if(!default_info->name, ERROR); + } else { + _E("Fail to get name from pkg info table"); + goto ERROR; + } + + _D("list add id : [%s], icon : [%s], name : [%s]", pkg_info->pkgid, pkg_info->icon, pkg_info->name); + + return default_info; + +ERROR: + + _pkglist_unretrieve_item(default_info); + return NULL; +} + + + +int _get_pkginfo_cb(pkgmgrinfo_appinfo_h app_handle, void *user_data) +{ + char *appid = NULL; + char *pkgid = NULL; + char *name = NULL; + char *icon = NULL; + private_pkginfo_s *pkg_info = NULL; + + pkg_info = calloc(1, sizeof(*pkg_info)); + retv_if(!pkg_info, PMINFO_R_ERROR); + + memset(pkg_info, 0, sizeof(private_pkginfo_s)); + + pkgmgrinfo_appinfo_get_appid(app_handle, &appid); + goto_if(!appid, ERROR); + + pkg_info->appid = strdup(appid); + goto_if(!pkg_info->appid, ERROR); + + if (PMINFO_R_OK != pkgmgrinfo_appinfo_is_taskmanage(app_handle, &pkg_info->taskmanage)) { + goto ERROR; + } + + if (PMINFO_R_OK != pkgmgrinfo_appinfo_get_pkgid(app_handle, &pkgid)) { + goto ERROR; + } + pkg_info->pkgid = strdup(pkgid); + goto_if(!pkg_info->pkgid, ERROR); + + if (PMINFO_R_OK != pkgmgrinfo_appinfo_get_icon(app_handle, &icon)) { + goto ERROR; + } + if (icon) { + pkg_info->icon= strdup(icon); + goto_if(!pkg_info->icon, ERROR); + } + + if (PMINFO_R_OK != pkgmgrinfo_appinfo_get_label(app_handle, &name)) { + goto ERROR; + } + if (name) { + pkg_info->name= strdup(name); + goto_if(!pkg_info->name, ERROR); + } + + if (PMINFO_R_OK != pkgmgrinfo_appinfo_is_nodisplay(app_handle, &pkg_info->nodisplay)) { + goto ERROR; + } + + eina_hash_add(private_table_s.pkginfo_table, pkg_info->appid, pkg_info); + + return PMINFO_R_OK; + +ERROR: + if (pkg_info->name) free(pkg_info->name); + if (pkg_info->icon) free(pkg_info->icon); + if (pkg_info->pkgid) free(pkg_info->pkgid); + if (pkg_info->appid) free(pkg_info->appid); + free(pkg_info); + + return PMINFO_R_ERROR; +} + + + +static task_mgr_error_e _create_pkginfo_table(void) +{ + _D(""); + pkgmgrinfo_appinfo_filter_h handle; + + int ret = 0; + + private_table_s.pkginfo_table = eina_hash_string_superfast_new(NULL); + + ret = pkgmgrinfo_appinfo_filter_create(&handle); + if (PMINFO_R_OK != ret) { + return TASK_MGR_ERROR_FAIL; + } + + ret = pkgmgrinfo_appinfo_filter_add_bool(handle, PMINFO_APPINFO_PROP_APP_TASKMANAGE, 1); + if (PMINFO_R_OK != ret) { + pkgmgrinfo_appinfo_filter_destroy(handle); + return TASK_MGR_ERROR_FAIL; + } + + ret = pkgmgrinfo_appinfo_filter_foreach_appinfo(handle, _get_pkginfo_cb, NULL); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_filter_destroy(handle); + return TASK_MGR_ERROR_FAIL; + } + + pkgmgrinfo_appinfo_filter_destroy(handle); + + return TASK_MGR_ERROR_NONE; +} + + + +static Eina_Bool _remove_pkginfo(const Eina_Hash *hash, const void *key, void *data, void *fdata) +{ + retv_if(!data, EINA_FALSE); + + private_pkginfo_s *pkg_info = data; + + if (pkg_info->name) free(pkg_info->name); + if (pkg_info->icon) free(pkg_info->icon); + if (pkg_info->pkgid) free(pkg_info->pkgid); + if (pkg_info->appid) free(pkg_info->appid); + + return EINA_TRUE; +} + + + +static void _destroy_pkginfo_table(void) +{ + _D(""); + + eina_hash_foreach(private_table_s.pkginfo_table, _remove_pkginfo, NULL); + eina_hash_free(private_table_s.pkginfo_table); + private_table_s.pkginfo_table = NULL; +} + + + +static int _launch_time_sort_cb(const void *d1, const void *d2) +{ + list_type_default_s *tmp1 = (list_type_default_s *) d1; + list_type_default_s *tmp2 = (list_type_default_s *) d2; + + if (!tmp1) return -1; + if (!tmp2) return 1; + + if (!tmp1->appid) return 1; + else if (!tmp2->appid) return -1; + + return tmp1->launch_time >= tmp2->launch_time ? -1 : 1; +} + + + +extern task_mgr_error_e list_sort(Eina_List *list, int (*_sort_cb)(const void *d1, const void *d2)) +{ + retv_if(!list, TASK_MGR_ERROR_INVALID_PARAMETER); + + list = eina_list_sort(list, eina_list_count(list), _sort_cb); + retv_if(!list, TASK_MGR_ERROR_FAIL); + + return TASK_MGR_ERROR_NONE; +} + + + +extern task_mgr_error_e list_create(Eina_List **pkg_list) +{ + _D(""); + + rua_init(); + char **table = NULL; + list_type_default_s *default_info = NULL; + + int nrows = 0, ncols = 0; + int row = 0; + + retv_if (TASK_MGR_ERROR_NONE != _create_pkginfo_table(), TASK_MGR_ERROR_FAIL); + + if (-1 == rua_history_load_db(&table, &nrows, &ncols)) { + if (table) { + rua_history_unload_db(&table); + } + return TASK_MGR_ERROR_FAIL; + } + + _D("Apps in rua history is %d", nrows); + + for (; row < nrows; row++) { + struct rua_rec rec_result = {0, }; + rua_history_get_rec(&rec_result, table, nrows, ncols, row); + default_info = _pkglist_retrieve_item(rec_result.pkg_name, rec_result.arg, rec_result.launch_time); + if (default_info) { + *pkg_list = eina_list_append(*pkg_list, default_info); + } + } + + if (*pkg_list && TASK_MGR_ERROR_NONE != list_sort(*pkg_list, _launch_time_sort_cb)) { + _E("Cannot sort pkg_list"); + } + + if (!eina_list_count(*pkg_list)) { + _D("list is empty."); + _pkglist_unretrieve_item(default_info); + return TASK_MGR_ERROR_NO_DATA; + + } + + return TASK_MGR_ERROR_NONE; +} + + + +extern void list_destroy(Eina_List *pkg_list) +{ + _D(""); + list_type_default_s *default_info = NULL; + + _destroy_pkginfo_table(); + + if (!pkg_list) { + _D("pkg_list is null"); + return; + } + + EINA_LIST_FREE(pkg_list, default_info) { + if (!default_info) { + continue; + } + _pkglist_unretrieve_item(default_info); + } + + pkg_list = NULL; + rua_fini(); +} diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..7d4eb11 --- /dev/null +++ b/src/main.c @@ -0,0 +1,309 @@ +/* + * Task Manager + * + * Copyright (c) 2000 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include +#include +#include +#include + +#include "conf.h" +#include "item.h" +#include "list.h" +#include "log.h" +#include "main.h" +#include "scroller.h" +#include "util.h" + +#define KEY_BACK "XF86Back" +#define PRIVATE_DATA_KEY_LIST_TIMER "pri_list_tm" + +static main_s main_info = { + .e = NULL, + .win = NULL, + .layout = NULL, + .scroller = NULL, + .box = NULL, + .pkg_list = NULL, + + .root_w = 0, + .root_h = 0, +}; +//main_h main_info_h = &main_info; + + + +extern main_h main_get_info(void) +{ + return &main_info; +} + + + +static Eina_Bool _back_key_pressed(void *data, Evas_Object *obj, Evas_Object *src, Evas_Callback_Type type, void *event_info) +{ + _D(""); + Evas_Event_Key_Down *ev = event_info; + + if (type == EVAS_CALLBACK_KEY_DOWN && strncmp(KEY_BACK, ev->key, strlen(KEY_BACK)) == 0) { + _D("KEY PRESSED: %s", ev->key); + + elm_exit(); + return EINA_TRUE; + } else { + return EINA_FALSE; + } +} + + + +static task_mgr_error_e _create_layout(Evas_Object *parent) +{ + _D(""); + Evas_Object *layout = NULL; + Evas_Object *rect = NULL; + Eina_Bool ret = EINA_FALSE; + + // create bg + main_info.bg = elm_bg_add(main_info.win); + if (!main_info.bg) { + _E("cannot create bg"); + evas_object_del(main_info.win); + } + + elm_win_resize_object_add(main_info.win, main_info.bg); + evas_object_color_set(main_info.bg, 0, 0, 0, BG_COLOR); + evas_object_show(main_info.bg); + + // create layout + layout = elm_layout_add(parent); + goto_if (!layout, ERROR); + + ret = elm_layout_file_set(layout, LAYOUT, "layout"); + goto_if(EINA_FALSE == ret, ERROR); + + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_move(layout, 0, 0); + evas_object_resize(layout, main_info.root_w, main_info.root_h); + evas_object_show(layout); + + main_info.layout = layout; + + // create layout bg + rect = evas_object_rectangle_add(evas_object_evas_get(layout)); + evas_object_size_hint_min_set(rect, main_info.root_w, main_info.root_h); + evas_object_size_hint_weight_set(rect, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_resize(rect, main_info.root_w, main_info.root_h); + evas_object_color_set(rect, 0, 0, 0, 0); + evas_object_show(rect); + elm_object_part_content_set(layout, BG_PART_NAME, rect); + + // create scroller + main_info.scroller = scroller_create(layout); + goto_if(!main_info.scroller, ERROR); + + return TASK_MGR_ERROR_NONE; + +ERROR: + if (layout) evas_object_del(layout); + if (main_info.bg) evas_object_del(main_info.bg); + evas_object_del(main_info.win); + return TASK_MGR_ERROR_FAIL; +} + + + +static void _destroy_layout(void) +{ + Evas_Object *rect = NULL; + + if (main_info.layout) { + rect = elm_object_part_content_unset(main_info.layout, BG_PART_NAME); + if (rect) { + evas_object_del(rect); + } + evas_object_del(main_info.layout); + main_info.layout = NULL; + } +} + + + +static Eina_Bool _list_timer_cb(void *data) +{ + _D(""); + Evas_Object *clear_item = NULL; + task_mgr_error_e ret = TASK_MGR_ERROR_NONE; + + if (main_info.pkg_list) { + _D("Already loaded"); + goto END; + } + + clear_item = item_clear_all_create(main_info.scroller); + if (!clear_item) { + _E("Fail to create clear all button"); + return ECORE_CALLBACK_CANCEL; + } + scroller_push_item(main_info.scroller, clear_item); + + ret = list_create(&main_info.pkg_list); + elm_object_part_text_set(main_info.layout, "no,apps,txt", _("IDS_TASKMGR_NPBODY_NO_APPLICATIONS_ABB2")); + if (TASK_MGR_ERROR_NO_DATA == ret) { + _D("There is no application"); + item_clear_set_disable(main_info.scroller); + } else if (TASK_MGR_ERROR_NONE != ret) { + _E("Fail to create pkglist"); + goto END; + } + + goto_if(TASK_MGR_ERROR_NONE != scroller_push_all_item(main_info.scroller, main_info.pkg_list), END); + +END: + evas_object_data_del(main_info.win, PRIVATE_DATA_KEY_LIST_TIMER); + return ECORE_CALLBACK_CANCEL; +} + + + +static bool _create_cb(void *data) +{ + _D(""); + + Ecore_Timer *timer = NULL; + + main_info.win = elm_win_add(NULL, "Task-mgr", ELM_WIN_BASIC); + retv_if(!main_info.win, false); + + elm_app_base_scale_set(2.6); + elm_win_screen_size_get(main_info.win, NULL, NULL, &main_info.root_w, &main_info.root_h); + _D("screen size is (%d, %d)", main_info.root_w, main_info.root_h); + + elm_object_event_callback_add(main_info.win, _back_key_pressed, NULL); + + elm_win_indicator_mode_set(main_info.win, ELM_WIN_INDICATOR_SHOW); + elm_win_indicator_opacity_set(main_info.win, ELM_WIN_INDICATOR_TRANSPARENT); + + elm_win_borderless_set(main_info.win, EINA_TRUE); + elm_win_alpha_set(main_info.win, EINA_TRUE); + evas_object_show(main_info.win); + + main_info.e = evas_object_evas_get(main_info.win); + + if (_create_layout(main_info.win) != TASK_MGR_ERROR_NONE) { + _E("Failed to create a layout"); + return false; + } + + //create the list + timer = evas_object_data_get(main_info.win, PRIVATE_DATA_KEY_LIST_TIMER); + if (timer) { + ecore_timer_del(timer); + } + + timer = ecore_timer_add(0.001f, _list_timer_cb, NULL); + if (timer) { + evas_object_data_set(main_info.win, PRIVATE_DATA_KEY_LIST_TIMER, timer); + } else { + _E("Cannot add a create list timer"); + } + + return true; +} + + + +static void _terminate_cb(void *data) +{ + _D(""); + + /* list destroy */ + list_destroy(main_info.pkg_list); + evas_object_data_del(main_info.win, PRIVATE_DATA_KEY_LIST_TIMER); + + elm_cache_all_flush(); + malloc_trim(0); + appcore_flush_memory(); + + scroller_destroy(main_info.scroller); + _destroy_layout(); + + /** + * Even though the window is deleted automatically, + * It is good habit to delete window explicitly by your hands. + */ + + if (main_info.win) { + evas_object_del(main_info.win); + main_info.win = NULL; + } +} + + + +static void _app_control(app_control_h service, void *data) +{ + _D(""); + + return; +} + + + +static void _pause_cb(void *data) +{ + _D(""); + + elm_exit(); + return; +} + + + +static void _language_changed(app_event_info_h event_info, void *data) +{ + _D(""); +} + + + +int main(int argc, char **argv) +{ + int ret; + ui_app_lifecycle_callback_s lifecycle_callback = {0, }; + app_event_handler_h event_handlers[5] = {NULL, }; + + lifecycle_callback.create = _create_cb; + lifecycle_callback.terminate = _terminate_cb; + lifecycle_callback.pause = _pause_cb; + lifecycle_callback.resume = NULL; + lifecycle_callback.app_control = _app_control; + + ui_app_add_event_handler(&event_handlers[APP_EVENT_LOW_BATTERY], APP_EVENT_LOW_BATTERY, NULL, NULL); + ui_app_add_event_handler(&event_handlers[APP_EVENT_LOW_MEMORY], APP_EVENT_LOW_MEMORY, NULL, NULL); + ui_app_add_event_handler(&event_handlers[APP_EVENT_DEVICE_ORIENTATION_CHANGED], APP_EVENT_DEVICE_ORIENTATION_CHANGED, NULL, NULL); + ui_app_add_event_handler(&event_handlers[APP_EVENT_LANGUAGE_CHANGED], APP_EVENT_LANGUAGE_CHANGED, _language_changed, NULL); + ui_app_add_event_handler(&event_handlers[APP_EVENT_REGION_FORMAT_CHANGED], APP_EVENT_REGION_FORMAT_CHANGED, NULL, NULL); + + ret = ui_app_main(argc, argv, &lifecycle_callback, &main_info); + + return ret; +} + +/* End of a file */ diff --git a/src/scroller.c b/src/scroller.c new file mode 100644 index 0000000..1b0cb00 --- /dev/null +++ b/src/scroller.c @@ -0,0 +1,500 @@ +/* + * Task Manager + * + * Copyright (c) 2000 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + #include + + #include "conf.h" + #include "item.h" + #include "list.h" + #include "log.h" + #include "main.h" + #include "scroller.h" + #include "util.h" + +#define PRIVATE_DATA_KEY_DRAG "pri_drag" +#define PRIVATE_DATA_KEY_MOUSE_DOWN "pri_m_dw" +#define PRIVATE_DATA_KEY_POP_ALL_TIMER "pri_pop_tm" +#define PRIVATE_DATA_KEY_REVERSE_LIST "pri_re_li" +#define PRIVATE_DATA_KEY_TERMINATE "pri_tm" + + + +extern task_mgr_error_e scroller_push_item(Evas_Object *scroller, Evas_Object *item) +{ + _D(""); + retv_if(!scroller, TASK_MGR_ERROR_INVALID_PARAMETER); + retv_if(!item, TASK_MGR_ERROR_INVALID_PARAMETER); + + Evas_Object *box_layout = NULL; + Evas_Object *box = NULL; + Eina_List *list = NULL; + + box_layout = elm_object_content_get(scroller); + retv_if(!box_layout, TASK_MGR_ERROR_FAIL); + + list = elm_box_children_get(box_layout); + retv_if(!list, TASK_MGR_ERROR_FAIL); + + box = eina_list_nth(list, 0); + retv_if(!box, TASK_MGR_ERROR_FAIL); + + eina_list_free(list); + + elm_box_pack_end(box, item); + + return TASK_MGR_ERROR_NONE; +} + + + +extern void scroller_pop_item(Evas_Object *scroller, Evas_Object *item, int terminate) +{ + ret_if(!scroller); + ret_if(!item); + + Evas_Object *box_layout = NULL; + Evas_Object *box = NULL; + Evas_Object *tmp_item = NULL; + + Eina_List *box_list = NULL; + Eina_List *list = NULL; + const Eina_List *l = NULL; + const Eina_List *ln = NULL; + + box_layout = elm_object_content_get(scroller); + ret_if(!box_layout); + + box_list = elm_box_children_get(box_layout); + ret_if(!box_list); + + box = eina_list_nth(box_list, 0); + ret_if(!box); + + eina_list_free(box_list); + + list = elm_box_children_get(box); + ret_if(!list); + + EINA_LIST_FOREACH_SAFE(list, l, ln, tmp_item) { + if (item != tmp_item) continue; + if (terminate) item_terminate(item); + + elm_box_unpack(box, item); + item_destroy(item); + break; + } + eina_list_free(list); +} + + + +extern task_mgr_error_e scroller_push_all_item(Evas_Object *scroller, Eina_List *list) +{ + const Eina_List *l = NULL; + const Eina_List *ln = NULL; + list_type_default_s *info = NULL; + Evas_Object *item = NULL; + + if (!list) { + _D("No app in the history list"); + return TASK_MGR_ERROR_NONE; + } + + EINA_LIST_FOREACH_SAFE(list, l, ln, info) { + if (!info) continue; + item = item_create(scroller, info); + continue_if(!item); + scroller_push_item(scroller, item); + } + + return TASK_MGR_ERROR_NONE; +} + + + +static Eina_Bool _pop_all_item_cb(void *data) +{ + Evas_Object *scroller = data; + Evas_Object *item = NULL; + Eina_List *list = NULL; + static int i = 0; + int count = 0; + int terminate = (int) evas_object_data_get(scroller, PRIVATE_DATA_KEY_TERMINATE); + + list = evas_object_data_get(scroller, PRIVATE_DATA_KEY_REVERSE_LIST); + goto_if(!list, END); + + count = eina_list_count(list); + _D("remove list count(include clear button) : %d", count); + if (i >= count-1) goto END; + + item = eina_list_nth(list, i); + i++; + goto_if(!item, END); + + scroller_pop_item(scroller, item, terminate); + return ECORE_CALLBACK_RENEW; + +END: + i = 0; + eina_list_free(list); + evas_object_data_del(scroller, PRIVATE_DATA_KEY_REVERSE_LIST); + evas_object_data_del(scroller, PRIVATE_DATA_KEY_TERMINATE); + evas_object_data_del(scroller, PRIVATE_DATA_KEY_POP_ALL_TIMER); + item_clear_set_disable(scroller); + + return ECORE_CALLBACK_CANCEL; +} + + + +extern void scroller_pop_all_item(Evas_Object *scroller, int terminate) +{ + Evas_Object *box_layout = NULL; + Evas_Object *box = NULL; + Eina_List *box_list = NULL; + Eina_List *list = NULL; + Eina_List *reverse_list = NULL; + Ecore_Timer *timer = NULL; + + ret_if(!scroller); + + timer = evas_object_data_del(scroller, PRIVATE_DATA_KEY_POP_ALL_TIMER); + if (timer) { + _D("There is already a timer for popping all items."); + ecore_timer_del(timer); + } + + /* An user tap the end all button, all items have to be terminated even if paused. */ + if (!evas_object_data_get(scroller, PRIVATE_DATA_KEY_TERMINATE)) { + evas_object_data_set(scroller, PRIVATE_DATA_KEY_TERMINATE, (void *) terminate); + } + + box_layout = elm_object_content_get(scroller); + ret_if(!box_layout); + + box_list = elm_box_children_get(box_layout); + ret_if(!box_list); + + box = eina_list_nth(box_list, 0); + ret_if(!box); + + eina_list_free(box_list); + + list = elm_box_children_get(box); + if (!list) return; + + /* This reverse list should be freed in the timer */ + reverse_list = eina_list_reverse_clone(list); + eina_list_free(list); + ret_if(!reverse_list); + evas_object_data_set(scroller, PRIVATE_DATA_KEY_REVERSE_LIST, reverse_list); + + timer = ecore_timer_add(0.01f, _pop_all_item_cb, scroller); + if (!timer) { + _E("Cannot add a timer"); + evas_object_data_del(scroller, PRIVATE_DATA_KEY_REVERSE_LIST); + evas_object_data_del(scroller, PRIVATE_DATA_KEY_TERMINATE); + eina_list_free(reverse_list); + return; + } + + evas_object_data_set(scroller, PRIVATE_DATA_KEY_POP_ALL_TIMER, timer); +} + + + +extern int scroller_count(Evas_Object *scroller) +{ + Evas_Object *box_layout = NULL; + Evas_Object *box = NULL; + Eina_List *box_list = NULL; + Eina_List *list = NULL; + + retv_if(!scroller, 0); + + box_layout = elm_object_content_get(scroller); + retv_if(!box_layout, 0); + + box_list = elm_box_children_get(box_layout); + retv_if(!box_list, 0); + + box = eina_list_nth(box_list, 0); + retv_if(!box, 0); + + eina_list_free(box_list); + + list = elm_box_children_get(box); + if (!list) { + _D("list is null"); + return 0; + } + + return eina_list_count(list); +} + + + +extern Eina_Bool scroller_is_scrolling(Evas_Object *scroller) +{ + return evas_object_data_get(scroller, DATA_KEY_IS_SCROLLING)? EINA_TRUE:EINA_FALSE; +} + + + +extern void scroller_freeze(Evas_Object *scroller) +{ + Evas_Object *box_layout = NULL; + Evas_Object *box = NULL; + Eina_List *list = NULL; + + ret_if(!scroller); + + box_layout = elm_object_content_get(scroller); + ret_if(!box_layout); + + list = elm_box_children_get(box_layout); + ret_if(!list); + + box = eina_list_nth(list, 0); + ret_if(!box); + + eina_list_free(list); + + elm_object_scroll_freeze_push(box); +} + + + +extern void scroller_unfreeze(Evas_Object *scroller) +{ + Evas_Object *box_layout = NULL; + Evas_Object *box = NULL; + Eina_List *list = NULL; + + ret_if(!scroller); + + box_layout = elm_object_content_get(scroller); + ret_if(!box_layout); + + list = elm_box_children_get(box_layout); + ret_if(!list); + + box = eina_list_nth(list, 0); + ret_if(!box); + + eina_list_free(list); + + while (elm_object_scroll_freeze_get(box)) { + elm_object_scroll_freeze_pop(box); + } +} + + + +static void _mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + _D("Mouse is down"); + evas_object_data_set(obj, PRIVATE_DATA_KEY_MOUSE_DOWN, (void *) 1); +} + + + +static void _mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + _D("Mouse is up"); + evas_object_data_del(obj, PRIVATE_DATA_KEY_MOUSE_DOWN); + if (evas_object_data_get(obj, PRIVATE_DATA_KEY_DRAG)) return; + evas_object_data_del(obj, DATA_KEY_IS_SCROLLING); +} + + + +static void _anim_start_cb(void *data, Evas_Object *scroller, void *event_info) +{ + _D("start the scroller animation"); + evas_object_data_set(scroller, DATA_KEY_IS_SCROLLING, (void *) 1); +} + + + +static void _anim_stop_cb(void *data, Evas_Object *scroller, void *event_info) +{ + _D("stop the scroller animation"); + if (evas_object_data_get(scroller, PRIVATE_DATA_KEY_MOUSE_DOWN)) return; + evas_object_data_del(scroller, DATA_KEY_IS_SCROLLING); +} + + + +static void _drag_start_cb(void *data, Evas_Object *scroller, void *event_info) +{ + _D("start to drag the scroller animation"); + evas_object_data_set(scroller, PRIVATE_DATA_KEY_DRAG, (void *) 1); +} + + + +static void _drag_stop_cb(void *data, Evas_Object *scroller, void *event_info) +{ + _D("stop to drag the scroller animation"); + evas_object_data_del(scroller, PRIVATE_DATA_KEY_DRAG); +} + + + +static void _scroll_cb(void *data, Evas_Object *scroller, void *event_info) +{ + evas_object_data_set(scroller, DATA_KEY_IS_SCROLLING, (void *) 1); +} + + + +static void __resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Evas_Object *scroller = obj; + + int x, y, w, h; + + ret_if(!scroller); + + evas_object_geometry_get(scroller, &x, &y, &w, &h); + _D("%s resize(%d, %d, %d, %d)", data, x, y, w, h); +} + + + +extern Evas_Object *scroller_create(Evas_Object *layout) +{ + retv_if(!layout, NULL); + + Evas_Object *box = NULL; + Evas_Object *box_layout = NULL; + Evas_Object *rect = NULL; + Evas_Object *scroller = NULL; + + scroller = elm_scroller_add(layout); + retv_if(!scroller, NULL); + + elm_scroller_bounce_set(scroller, EINA_FALSE, EINA_FALSE); + elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_object_style_set(scroller, "effect"); + + elm_object_part_content_set(layout, "scroller", scroller); + evas_object_show(scroller); + evas_object_size_hint_align_set(scroller, 0.5, 1.0); + + evas_object_event_callback_add(scroller, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down_cb, NULL); + evas_object_event_callback_add(scroller, EVAS_CALLBACK_MOUSE_UP, _mouse_up_cb, NULL); + evas_object_smart_callback_add(scroller, "scroll,anim,start", _anim_start_cb, NULL); + evas_object_smart_callback_add(scroller, "scroll,anim,stop", _anim_stop_cb, NULL); + evas_object_smart_callback_add(scroller, "scroll,drag,start", _drag_start_cb, NULL); + evas_object_smart_callback_add(scroller, "scroll,drag,stop", _drag_stop_cb, NULL); + evas_object_smart_callback_add(scroller, "scroll", _scroll_cb, NULL); + + /* Because change an align in box, use the another box betweein box and scroller. */ + box_layout = elm_box_add(scroller); + if (!box_layout) { + _E("Fail to create box layout"); + evas_object_del(scroller); + return NULL; + } + elm_box_horizontal_set(box_layout, EINA_FALSE); + elm_box_align_set(box_layout, 0.5, 1.0); + evas_object_size_hint_align_set(box_layout, 0.5, 1.0); + evas_object_size_hint_weight_set(box_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_content_set(scroller, box_layout); + evas_object_show(box_layout); + + box = elm_box_add(scroller); + if (!box) { + _E("Fail to create box"); + evas_object_del(box_layout); + evas_object_del(scroller); + return NULL; + } + elm_box_horizontal_set(box, EINA_FALSE); + elm_box_align_set(box, 0.5, 1.0); + evas_object_size_hint_align_set(box, 0.5, 1.0); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(box_layout, box); + evas_object_show(box); + main_get_info()->box = box; + + evas_object_event_callback_add(scroller, EVAS_CALLBACK_RESIZE, __resize_cb, "scroller"); + evas_object_event_callback_add(box_layout, EVAS_CALLBACK_RESIZE, __resize_cb, "box_layout"); + evas_object_event_callback_add(box, EVAS_CALLBACK_RESIZE, __resize_cb, "box"); + + return scroller; +} + + + +void scroller_destroy(Evas_Object *scroller) +{ + ret_if(!scroller); + + Evas_Object *item = NULL; + Evas_Object *box_layout = NULL; + Evas_Object *box = NULL; + Evas_Object *rect = NULL; + Eina_List *box_list = NULL; + Eina_List *list = NULL; + + ret_if(!scroller); + + box_layout = elm_object_content_get(scroller); + ret_if(!box_layout); + + box_list = elm_box_children_get(box_layout); + ret_if(!box_list); + + box = eina_list_nth(box_list, 0); + ret_if(!box); + eina_list_free(box_list); + + list = elm_box_children_get(box); + if (!list) { + _D("list is empty"); + return; + } + + EINA_LIST_FREE(list, item) { + if (!item) break; + elm_box_unpack(box, item); + item_destroy(item); + } + + evas_object_del(box); + evas_object_del(box_layout); + + evas_object_event_callback_del(scroller, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down_cb); + evas_object_event_callback_del(scroller, EVAS_CALLBACK_MOUSE_UP, _mouse_up_cb); + evas_object_smart_callback_del(scroller, "scroll,anim,start", _anim_start_cb); + evas_object_smart_callback_del(scroller, "scroll,anim,stop", _anim_stop_cb); + evas_object_smart_callback_del(scroller, "scroll,drag,start", _drag_start_cb); + evas_object_smart_callback_del(scroller, "scroll,drag,stop", _drag_stop_cb); + evas_object_smart_callback_del(scroller, "scroll", _scroll_cb); + + evas_object_del(scroller); +} + + + +/* End of the file */ diff --git a/src/util.c b/src/util.c new file mode 100644 index 0000000..332b3ee --- /dev/null +++ b/src/util.c @@ -0,0 +1,109 @@ +/* + * Task Manager + * + * Copyright (c) 2000 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include +#include +#include +#include + +#include "log.h" +#include "util.h" + + + +extern Eina_Bool util_kill_app(const char *appid) +{ + app_context_h context = NULL; + Eina_Bool ret = EINA_TRUE; + + retv_if(!appid, EINA_FALSE); + + ret = app_manager_get_app_context(appid, &context); + if (ret != APP_MANAGER_ERROR_NONE) { + _E("fail to app_manager_get_app_context(%d)", ret); + return EINA_FALSE; + } + + ret = app_manager_terminate_app(context); + app_context_destroy(context); + + if (ret != APP_MANAGER_ERROR_NONE) { + _E("fail to terminate_app (%d)", ret); + return EINA_FALSE; + } + + _D("terminate app = %s", appid); + + return ret; +} + + + +extern Eina_Bool util_launch_app(const char *appid) +{ + int ret; + bool running = false; + + if (!appid || strlen(appid) == 0) { + _E("Fail to launch, due to Null appid."); + return EINA_FALSE; + } + _D("Launching: %s", appid); + ret = app_manager_is_running(appid, &running); + retv_if(APP_MANAGER_ERROR_NONE != ret, EINA_FALSE); + + if (running) { + _D("THE APP IS RUNNING"); + + app_context_h context = NULL; + ret = app_manager_get_app_context(appid, &context); + if (ret != APP_MANAGER_ERROR_NONE) { + _E("fail to app_manager_get_app_context(%d)", ret); + return EINA_FALSE; + } + + ret = app_manager_resume_app(context); + app_context_destroy(context); + + if (ret != APP_MANAGER_ERROR_NONE) { + _E("fail to app_manager_resume_app(%d)", ret); + return EINA_FALSE; + } + + } else { + _D("THE APP IS NOT RUNNING"); + + app_control_h service = NULL; + retv_if(APP_CONTROL_ERROR_NONE != app_control_create(&service), EINA_FALSE); + retv_if(!service, EINA_FALSE); + + app_control_set_app_id(service, appid); + + ret = app_control_send_launch_request(service, NULL, NULL); + (void)app_control_destroy(service); + retv_if(APP_CONTROL_ERROR_NONE != ret, EINA_FALSE); + } + + return EINA_TRUE; +} + + + +//End of file diff --git a/task-mgr-spin.creator.user b/task-mgr-spin.creator.user new file mode 100644 index 0000000..2b896cd --- /dev/null +++ b/task-mgr-spin.creator.user @@ -0,0 +1,186 @@ + + + + + + ProjectExplorer.Project.ActiveTarget + 0 + + + ProjectExplorer.Project.EditorSettings + + false + false + true + + Cpp + + CppGlobal + + + + QmlJS + + QmlJSGlobal + + + 2 + UTF-8 + false + 4 + false + true + 1 + true + 1 + true + 1 + 8 + true + 1 + false + true + true + true + + + + ProjectExplorer.Project.PluginSettings + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop + {684c47e8-d6bb-4ad1-a9c6-9180bed66dfd} + 0 + 0 + 0 + + /home/khee85/spin/task-mgr-lite + + + + all + + false + + + true + Make + + GenericProjectManager.GenericMakeStep + + 1 + Build + + ProjectExplorer.BuildSteps.Build + + + + + clean + + true + + + true + Make + + GenericProjectManager.GenericMakeStep + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Default + Default + GenericProjectManager.GenericBuildConfiguration + + 1 + + + 0 + Deploy + + ProjectExplorer.BuildSteps.Deploy + + 1 + Deploy locally + + ProjectExplorer.DefaultDeployConfiguration + + 1 + + + + false + false + false + false + true + 0.01 + 10 + true + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + + + false + %{buildDir} + Custom Executable + + ProjectExplorer.CustomExecutableRunConfiguration + 3768 + true + false + false + false + true + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.EnvironmentId + {34f591bc-6b5b-4cb5-922e-abe922ef66f6} + + + ProjectExplorer.Project.Updater.FileVersion + 15 + + -- 2.7.4