* limitations under the License.
*
*/
-#include <pthread.h>
-
#include <zone/zone.h>
#include <zone/app-proxy.h>
#include <zone/package-proxy.h>
static zone_app_proxy_h __zone_app;
static zone_manager_h __zone_mgr;
-static bool __app_terminated = false;
-
static bool __get_app_info_cb(app_info_h app_h, void* user_data)
{
- char* app_label = NULL, *app_icon = NULL, *app_id, *pkg_id;
+ char* pkg_id, *app_id, *app_label = NULL, *app_icon = NULL;
bool nodisplay = false;
- if (__app_terminated)
- return false;
-
app_info_is_nodisplay(app_h, &nodisplay);
if (nodisplay)
return true;
- app_info_get_app_id(app_h, &app_id);
- app_info_get_label(app_h, &app_label);
- app_info_get_icon(app_h, &app_icon);
app_info_get_package(app_h, &pkg_id);
if (user_data == NULL || !strncmp(user_data, pkg_id, PATH_MAX)) {
+ app_info_get_app_id(app_h, &app_id);
+ app_info_get_label(app_h, &app_label);
+ app_info_get_icon(app_h, &app_icon);
+
_create_app_icon(pkg_id, app_id, app_label, app_icon);
+ free(app_id);
+ if (app_label != NULL) {
+ free(app_label);
+ }
+ if (app_icon != NULL) {
+ free(app_icon);
+ }
}
-
- free(app_id);
free(pkg_id);
- if (app_label != NULL) {
- free(app_label);
- }
- if (app_icon != NULL) {
- free(app_icon);
- }
return true;
}
-void* create_app_thread(void* data) {
+static void __create_icon(void *data) {
zone_app_proxy_foreach_app_info(__zone_app, __get_app_info_cb, data);
if (data != NULL) {
free(data);
}
- return NULL;
-}
-
-void* destroy_app_thread(void* data) {
- _destroy_app_icon(data);
- free(data);
- return NULL;
}
static void __pkg_event_cb(const char* type,
package_manager_event_state_e event_state, int progress,
package_manager_error_e error, void* user_data)
{
- pthread_t tid;
-
if (event_state == PACKAGE_MANAGER_EVENT_STATE_COMPLETED) {
if (event_type == PACKAGE_MANAGER_EVENT_TYPE_INSTALL) {
- pthread_create(&tid, NULL, create_app_thread, strdup(pkg_id));
+ ecore_main_loop_thread_safe_call_async(__create_icon, strdup(pkg_id));
} else if (event_type == PACKAGE_MANAGER_EVENT_TYPE_UNINSTALL) {
- pthread_create(&tid, NULL, destroy_app_thread, strdup(pkg_id));
+ _destroy_app_icon(pkg_id);
}
}
}
ui_app_exit();
}
-void _icon_clicked_cb(char *app_id)
+void _icon_clicked_cb(const char *app_id)
{
zone_app_proxy_launch(__zone_app, app_id);
ui_app_exit();
zone_iterator_h it;
const char* zone_name;
char *current_zone_name;
- pthread_t tid;
current_zone_name = __get_current_zone_name();
zone_manager_create(&__zone_mgr);
PACKAGE_MANAGER_STATUS_TYPE_UNINSTALL);
zone_package_proxy_set_event_cb(__zone_pkg, __pkg_event_cb, NULL);
- pthread_create(&tid, NULL, create_app_thread, NULL);
+ ecore_main_loop_thread_safe_call_async(__create_icon, NULL);
zone_iterator_destroy(it);
free(current_zone_name);
static void __app_terminate(void *data)
{
- __app_terminated = true;
-
zone_package_proxy_destroy(__zone_pkg);
zone_app_proxy_destroy(__zone_app);
zone_manager_destroy(__zone_mgr);
#include "conf.h"
static uidata_s ud = {0, };
+
static int __num_of_apps = 0;
static void __block_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
ui_app_exit();
}
-int __icon_down_x, __icon_down_y;
-static void __app_icon_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) {
- Evas_Event_Mouse_Up* ev = event_info;
-
- __icon_down_x = ev->output.x;
- __icon_down_y = ev->output.y;
-}
-
-static void __app_icon_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+static void __app_view_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
{
- Evas_Event_Mouse_Up* ev = event_info;
- int distance_x = (ev->output.x - __icon_down_x);
- int distance_y = (ev->output.y - __icon_down_y);
- int distance = distance_x * distance_x + distance_y * distance_y;
-
- if (distance <= ALLOWED_ICON_DRAG_DISTANCE) {
- _icon_clicked_cb(data);
- }
- free(data);
+ eina_list_free(ud.app_icon_list);
}
static void __set_kaskit_layout(const char *name)
elm_table_homogeneous_set(ud.app_view, EINA_TRUE);
elm_object_content_set(ud.scroller, ud.app_view);
+ evas_object_event_callback_add(ud.app_view, EVAS_CALLBACK_DEL, __app_view_del_cb, NULL);
+
return;
}
return;
}
-void _create_app_icon(char* pkg_id, char* app_id, char* label, char* icon)
+int __icon_down_x, __icon_down_y;
+static void __app_icon_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) {
+ Evas_Event_Mouse_Up* ev = event_info;
+
+ __icon_down_x = ev->output.x;
+ __icon_down_y = ev->output.y;
+}
+
+static void __app_icon_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Mouse_Up* ev = event_info;
+ int distance_x = (ev->output.x - __icon_down_x);
+ int distance_y = (ev->output.y - __icon_down_y);
+ int distance = distance_x * distance_x + distance_y * distance_y;
+
+ if (distance <= ALLOWED_ICON_DRAG_DISTANCE) {
+ _icon_clicked_cb(data);
+ }
+ free(data);
+}
+
+static void __app_icon_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
{
- char string[1024] = {0, };
+ free(evas_object_data_get(obj, "package"));
+}
+
+void _create_app_icon(const char* pkg_id, const char* app_id, const char* label, const char* icon)
+{
+ char string[1024] = {0, }, *default_icon;
Evas_Object *icon_layout;
Evas_Object *icon_image;
evas_object_size_hint_weight_set(icon_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(icon_layout, 0.0, 0.0);
- if (!ecore_file_can_read(icon)) {
- free(icon);
- icon = __get_res_path("images/default_app_icon.png");
- }
-
icon_image = elm_image_add(icon_layout);
- elm_image_file_set(icon_image, icon, NULL);
+ if (ecore_file_can_read(icon)) {
+ elm_image_file_set(icon_image, icon, NULL);
+ } else {
+ default_icon = __get_res_path("images/default_app_icon.png");
+ elm_image_file_set(icon_image, default_icon, NULL);
+ free(default_icon);
+ }
evas_object_size_hint_min_set(icon_image, ICON_IMG_SIZE, ICON_IMG_SIZE);
evas_object_size_hint_max_set(icon_image, ICON_IMG_SIZE, ICON_IMG_SIZE);
elm_object_part_content_set(icon_layout, "icon_content", icon_image);
+ evas_object_data_set(icon_layout, "package", strdup(pkg_id));
+
+ evas_object_event_callback_add(icon_layout, EVAS_CALLBACK_DEL, __app_icon_del_cb, NULL);
evas_object_event_callback_add(icon_layout, EVAS_CALLBACK_MOUSE_DOWN, __app_icon_down_cb, NULL);
evas_object_event_callback_add(icon_layout, EVAS_CALLBACK_MOUSE_UP, __app_icon_up_cb, strdup(app_id));
elm_table_pack(ud.app_view, icon_layout, __num_of_apps % 3, __num_of_apps / 3, 1, 1);
evas_object_size_hint_min_set(ud.app_view, 0, (__num_of_apps / 3 + 1) * ICON_SIZE_H);
+ ud.app_icon_list = eina_list_append(ud.app_icon_list, icon_layout);
+
__num_of_apps++;
evas_object_show(icon_image);
evas_object_show(icon_layout);
+
}
-void _destroy_app_icon(char* pkg_id)
+void _destroy_app_icon(const char* pkg_id)
{
+ int index = 0;
+ Eina_List* i, *i_next;
+ Evas_Object* app_icon;
+ char *app_pkg_id;
+
+ EINA_LIST_FOREACH_SAFE(ud.app_icon_list, i, i_next, app_icon) {
+ app_pkg_id = evas_object_data_get(app_icon, "package");
+ if (strncmp(app_pkg_id, pkg_id, PATH_MAX)) {
+ elm_table_pack(ud.app_view, app_icon, index % 3, index / 3, 1, 1);
+ evas_object_size_hint_min_set(ud.app_view, 0, (__num_of_apps / 3 + 1) * ICON_SIZE_H);
+ index++;
+ continue;
+ }
+ elm_table_unpack(ud.app_view, app_icon);
+ evas_object_del(app_icon);
+ evas_object_size_hint_min_set(ud.app_view, 0, (__num_of_apps / 3 + 1) * ICON_SIZE_H);
+ ud.app_icon_list = eina_list_remove_list(ud.app_icon_list, i);
+ }
+ __num_of_apps--;
+ evas_object_size_hint_min_set(ud.app_view, 0, (__num_of_apps / 3 + 1) * ICON_SIZE_H);
}