Merge with private
authorJin Yoon <jinny.yoon@samsung.com>
Thu, 4 Jul 2013 01:56:49 +0000 (10:56 +0900)
committerJin Yoon <jinny.yoon@samsung.com>
Thu, 4 Jul 2013 01:56:49 +0000 (10:56 +0900)
16 files changed:
CMakeLists.txt
data/edje/all_apps_portrait.edc
data/edje/item_4x4.edc
data/edje/layout_portrait.edc
data/org.tizen.menu-screen.xml.in
include/all_apps/layout.h
include/conf.h
include/key.h [new file with mode: 0644]
include/popup.h
packaging/org.tizen.menu-screen.spec
src/all_apps/layout.c
src/item.c
src/key.c [new file with mode: 0644]
src/menu_screen.c
src/page_scroller.c
src/popup.c

index d1c20aa808bc243ffe18bb7444eafa5ada6b3dbc..4c410f69adc912212e0489c13534c4cede8e5864 100644 (file)
@@ -67,6 +67,7 @@ ADD_EXECUTABLE(${PROJECT_NAME}
        src/item.c
        src/item_badge.c
        src/item_event.c
+       src/key.c
        src/layout.c
        src/list.c
        src/mapbuf.c
index bbbc2875f5940c29d143f8ccde299e186c4f827c..b413286aa9f6246975ee08393686a03e62adbefc 100644 (file)
@@ -80,7 +80,7 @@ collections {
                                description {
                                        state: "default" 0.0;
                                        rel1 { relative: 0.0 134/1210; to, "bg"; } // 154 - 70
-                                       rel2 { relative: 1.0 1194/1210; to, "bg"; }
+                                       rel2 { relative: 1.0 1164/1210; to, "bg"; }
                                        color: 34 34 34 255;
                                        visible: 0;
                                }
index 7d688d2e35b1cb5fb63cac7c2700809bb73d031a..25e6750a9645916cd01e1fe8c02330572245debf 100644 (file)
@@ -62,8 +62,9 @@ collections {
                                mouse_events: 1;
                                description {
                                        state: "default" 0.0;
-                                       rel1 { relative: 0.5 54/ITEM_HEIGHT; }
-                                       rel2 { relative: 0.5 54/ITEM_HEIGHT; }
+                                       rel1 { relative: 0.5 60/ITEM_HEIGHT; to: "bg"; }
+                                       rel2 { relative: 0.5 60/ITEM_HEIGHT; to: "bg"; }
+                                       align: 0.5 0.5;
                                        min: 117 117;
                                        fixed: 1 1;
                                }
@@ -186,7 +187,7 @@ collections {
                                description
                                {
                                        state: "default" 0.0;
-                                       rel1 { relative: 0.0 1.0; to_x, "bg"; to_y, "icon_image"; }
+                                       rel1 { relative: 0.0 1.0; to_x, "bg"; to_y, "icon_image"; offset: 0 7; }
                                        rel2 { relative: 1.0 1.0; to, "bg"; }
                                        align: 0.5 0.0;
                                        color: 255 255 255 255;
index 0202a079f05d6670e34bced6534986bf22de31bd..50c40e26446d539b7834c0d3bd040f07aadb5c38 100644 (file)
@@ -45,9 +45,42 @@ collections {
                                        visible: 1;
                                }
                        }
+                       part {
+                               name: "content,blocker";
+                               type: RECT;
+                               scale: 1;
+                               mouse_events: 1;
+                               repeat_events: 0;
+                               description {
+                                       state: "default" 0.0;
+                                       rel1 { relative: 0.0 0.0; }
+                                       rel2 { relative: 1.0 1.0; }
+                                       color: 0 0 0 0;
+                                       visible: 0;
+                               }
+                               description {
+                                       state: "block" 0.0;
+                                       inherit: "default" 0.0;
+                                       visible: 1;
+                               }
+                       }
                }
 
                programs {
+                       program {
+                               name: "block,content";
+                               signal: "block";
+                               source: "layout";
+                               action: STATE_SET "block" 0.0;
+                               target: "content,blocker";
+                       }
+                       program {
+                               name: "unblock,content";
+                               signal: "unblock";
+                               source: "layout";
+                               action: STATE_SET "default" 0.0;
+                               target: "content,blocker";
+                       }
                }
        } // group
 } // collections
index 6646d3dc76f4825da9b59c04483c90fd8d223932..921afd48d917fc0d8786be36963430cbea7f3ced 100755 (executable)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns="http://tizen.org/ns/packages" package="@PACKAGE_NAME@" version="1.1.11" install-location="internal-only">
+<manifest xmlns="http://tizen.org/ns/packages" package="@PACKAGE_NAME@" version="1.1.12" install-location="internal-only">
        <label>Simple Menu-screen</label>
        <author email="jinny.yoon@samsung.com" href="www.samsung.com">Jin Yoon</author>
        <author email="yjoo93.park@samsung.com" href="www.samsung.com">Youngjoo Park</author>
index 258e9362b68dea16a30b209aa2db6b863eec6e7a..73cd02374af2117ecf55b3eae2e1935ba7925977 100644 (file)
 
 #define PAGE_MAX_APP 16
 
+extern bool all_apps_layout_is_edited(Evas_Object *all_apps);
+extern void all_apps_layout_edit(Evas_Object *all_apps);
+extern void all_apps_layout_unedit(Evas_Object *all_apps);
+
 extern Evas_Object *all_apps_layout_create(Evas_Object *controlbar, int rotate);
 extern void all_apps_layout_destroy(Evas_Object *all_apps);
 
index 7a4da32d309b11631da23db2e250de0e65e297b6..50d40f88ac80e72f038be62ac9ef59a1c7049ffb 100644 (file)
@@ -24,7 +24,7 @@
 #define BASE_HEIGHT 1280.0f
 #define BASE_WIDTH 720.0f
 
-#define PAGE_PORTRAIT_HEIGHT 1060.0f
+#define PAGE_PORTRAIT_HEIGHT 1030.0f
 #define INDEX_HEIGHT 70
 
 #define ITEM_WIDTH 180.0
diff --git a/include/key.h b/include/key.h
new file mode 100644 (file)
index 0000000..def465f
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+  * Copyright 2012  Samsung Electronics Co., Ltd
+  *
+  * Licensed under the Flora License, Version 1.1 (the "License");
+  * you may not use this file except in compliance with the License.
+  * You may obtain a copy of the License at
+  *
+  *     http://floralicense.org/license/
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  */
+
+#ifndef __MENU_SCREEN_INPUT_KEY_H__
+#define __MENU_SCREEN_INPUT_KEY_H__
+
+#include "util.h"
+
+HAPI void key_register(void);
+HAPI void key_unregister(void);
+HAPI void key_grab_home(void);
+HAPI void key_ungrab_home(void);
+
+#endif //__MENU_SCREEN_INPUT_KEY_H__
+
+// End of a file
index cff5fcd69cbefcbecc602cd9966bdd24f027e6a7..b894376ef6f56fa51201d57b0109e0999851cf72 100644 (file)
 #ifndef __MENU_SCREEN_POPUP_H__
 #define __MENU_SCREEN_POPUP_H__
 
-extern void popup_append_list(Evas_Object *popup);
-extern void popup_remove_list(Evas_Object *popup);
-extern void popup_free_list();
-
-extern Evas_Object *popup_create(Evas_Object *parent, const char *warning);
-extern void popup_destroy(Evas_Object *popup);
+extern Evas_Object *popup_exist(void);
+extern void popup_destroy_all(void);
+extern Evas_Object *popup_create_confirm(Evas_Object *parent, const char *warning);
 extern Evas_Object *popup_create_uninstall(Evas_Object *parent, Evas_Object *item);
 
 #endif //__MENU_SCREEN_POPUP_H__
index c8382780d81e700913ab0edc6332755dfb560747..848f5992cb2fc1439ee8f9623bdf87d0a9defa68 100644 (file)
@@ -16,7 +16,7 @@
 
 Name:       org.tizen.menu-screen
 Summary:    An utility library of the menu screen
-Version:    1.1.11
+Version:    1.1.12
 Release:    1.1
 Group:      TO_BE/FILLED_IN
 License:    Flora Software License
index 7411306c16f22b9b8c56c94687825069a866b605..092fbb82e105a7229368386d3f95ce4ab73c2493 100644 (file)
 #include "conf.h"
 #include "index.h"
 #include "item_event.h"
+#include "key.h"
 #include "layout.h"
 #include "list.h"
 #include "page_scroller.h"
+#include "popup.h"
 #include "util.h"
 #include "all_apps/layout.h"
 #include "all_apps/list.h"
 #define IDS_HS_BUTTON_DONE "IDS_HS_BUTTON_DONE"
 
 
+
+HAPI bool all_apps_layout_is_edited(Evas_Object *all_apps)
+{
+       retv_if(NULL == all_apps, false);
+       return (bool) evas_object_data_get(all_apps, "is_edited");
+}
+
+
+
 HAPI void all_apps_layout_edit(Evas_Object *all_apps)
 {
        Evas_Object *edit_button;
        Evas_Object *scroller;
 
+       evas_object_data_set(all_apps, "is_edited", (void *) true);
+
        edit_button = elm_object_part_content_get(all_apps, ALL_APPS_EDIT_BUTTON_PART);
        ret_if(NULL == edit_button);
        elm_object_signal_emit(edit_button, "edit_button_state,edit", "menu");
@@ -54,6 +67,8 @@ HAPI void all_apps_layout_edit(Evas_Object *all_apps)
        scroller = elm_object_part_content_get(all_apps, "content");
        ret_if(NULL == scroller);
        page_scroller_edit(scroller);
+
+       key_grab_home();
 }
 
 
@@ -64,6 +79,12 @@ HAPI void all_apps_layout_unedit(Evas_Object *all_apps)
 
        ret_if(NULL == all_apps);
 
+       key_ungrab_home();
+       popup_destroy_all();
+
+       bool is_edited = (bool) evas_object_data_get(all_apps, "is_edited");
+       if (false == is_edited) return;
+
        do {
                edit_button = elm_object_part_content_get(all_apps, ALL_APPS_EDIT_BUTTON_PART);
                ret_if(NULL == edit_button);
@@ -314,6 +335,7 @@ HAPI Evas_Object *all_apps_layout_create(Evas_Object *controlbar, int rotate)
        evas_object_data_set(all_apps, "is_under_pkgmgr", (void *) true);
        evas_object_data_set(all_apps, "rotate", (void *) rotate);
        evas_object_data_set(all_apps, "enable_bg_image", (void *) true);
+       evas_object_data_set(all_apps, "is_edited", (void *) true);
        evas_object_size_hint_min_set(all_apps, width, height);
        evas_object_size_hint_max_set(all_apps, width, height);
        evas_object_resize(all_apps, width, height);
@@ -385,6 +407,7 @@ HAPI void all_apps_layout_destroy(Evas_Object *all_apps)
        evas_object_data_del(all_apps, "is_under_pkgmgr");
        evas_object_data_del(all_apps, "rotate");
        evas_object_data_del(all_apps, "enable_bg_image");
+       evas_object_data_del(all_apps, "is_edited");
 
        evas_object_del(all_apps);
 }
index 0c98b4ab1b12210f3576ca291cc67c315e7eb2e3..39e2f34bfd140c6729d356979d1f408ff67d5d59 100644 (file)
@@ -879,7 +879,7 @@ HAPI void item_launch(Evas_Object *obj)
                        }
 
                        snprintf(sinform, len, D_("IDS_IDLE_POP_UNABLE_TO_LAUNCH_PS"), name);
-                       popup_create(obj, sinform);
+                       popup_create_confirm(obj, sinform);
 
                        free(sinform);
                        layout_disable_block(layout);
diff --git a/src/key.c b/src/key.c
new file mode 100644 (file)
index 0000000..007a0a3
--- /dev/null
+++ b/src/key.c
@@ -0,0 +1,206 @@
+ /*
+  * Copyright 2012  Samsung Electronics Co., Ltd
+  *
+  * Licensed under the Flora License, Version 1.1 (the "License");
+  * you may not use this file except in compliance with the License.
+  * You may obtain a copy of the License at
+  *
+  *     http://floralicense.org/license/
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  */
+
+
+
+#include <stdlib.h>
+#include <Elementary.h>
+#include <utilX.h>
+#include <Ecore_X.h>
+
+#include "conf.h"
+#include "key.h"
+#include "menu_screen.h"
+#include "page_scroller.h"
+#include "popup.h"
+#include "util.h"
+#include "all_apps/layout.h"
+
+
+
+static struct {
+       Eina_Bool pressed;
+       Ecore_Event_Handler *press_handler;
+       Ecore_Event_Handler *release_handler;
+       Eina_Bool register_handler;
+       Ecore_Timer *long_press;
+       Eina_Bool home_grabbed;
+} key_info = {
+       .pressed = 0,
+       .press_handler = NULL,
+       .release_handler = NULL,
+       .register_handler = EINA_FALSE,
+       .long_press = NULL,
+       .home_grabbed = EINA_FALSE,
+};
+
+
+
+#define KEY_LEFT "Left"
+#define KEY_RIGHT "Right"
+static Eina_Bool _key_release_cb(void *data, int type, void *event)
+{
+       Evas_Event_Key_Up *ev = event;
+
+       retv_if(EINA_FALSE == key_info.register_handler, ECORE_CALLBACK_CANCEL);
+       retv_if(NULL == ev, ECORE_CALLBACK_CANCEL);
+
+       _D("Key(%s) released %d", ev->keyname, key_info.pressed);
+
+       if (key_info.pressed == EINA_FALSE) return ECORE_CALLBACK_CANCEL;
+
+       do {
+               Evas_Object *win;
+               win = menu_screen_get_win();
+               break_if(NULL == win);
+
+               Evas_Object *layout;
+               layout = evas_object_data_get(win, "layout");
+               break_if(NULL == layout);
+
+               Evas_Object *all_apps;
+               all_apps = evas_object_data_get(layout, "all_apps");
+               break_if(NULL == all_apps);
+
+               Evas_Object *scroller = evas_object_data_get(all_apps, "scroller");
+               break_if(NULL == scroller);
+
+               if (!strcmp(ev->keyname, KEY_SELECT) || !strcmp(ev->keyname, KEY_BACK)) {
+                       if (popup_exist()) {
+                               popup_destroy_all();
+                               break;
+                       }
+
+                       if (all_apps_layout_is_edited(all_apps)) {
+                               all_apps_layout_unedit(all_apps);
+                       }
+               } else if (!strcmp(ev->keyname, KEY_LEFT) || !strcmp(ev->keyname, KEY_RIGHT)) {
+
+                       int cur_idx = page_scroller_get_current_page_no(scroller);
+
+                       int idx = 0, x = 0, w = 0;
+                       elm_scroller_region_get(scroller, &x, NULL, &w, NULL);
+
+                       if (w) idx = x / w;
+                       if (cur_idx != idx) {
+                               page_scroller_bring_in(scroller, idx);
+                       }
+               }
+       } while (0);
+
+       key_info.pressed = EINA_FALSE;
+
+       return ECORE_CALLBACK_CANCEL;
+}
+
+
+
+static Eina_Bool _key_press_cb(void *data, int type, void *event)
+{
+       Evas_Event_Key_Down *ev = event;
+
+       retv_if(EINA_FALSE == key_info.register_handler, ECORE_CALLBACK_CANCEL);
+       retv_if(NULL == ev, ECORE_CALLBACK_CANCEL);
+
+       key_info.pressed = EINA_TRUE;
+       _D("Key pressed %d", key_info.pressed);
+
+       return ECORE_CALLBACK_CANCEL;
+}
+
+
+
+HAPI void key_register(void)
+{
+       if (!key_info.release_handler) {
+               key_info.release_handler = ecore_event_handler_add(ECORE_EVENT_KEY_UP, _key_release_cb, NULL);
+               if (!key_info.release_handler) {
+                       _E("Failed to register a key up event handler");
+               }
+       }
+
+       if (!key_info.press_handler) {
+               key_info.press_handler = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, _key_press_cb, NULL);
+               if (!key_info.press_handler) {
+                       _E("Failed to register a key down event handler");
+               }
+       }
+
+       key_info.pressed = EINA_FALSE;
+       key_info.register_handler = EINA_TRUE;
+}
+
+
+
+HAPI void key_unregister(void)
+{
+       if (key_info.long_press) {
+               ecore_timer_del(key_info.long_press);
+               key_info.long_press = NULL;
+       }
+
+       if (key_info.release_handler) {
+               ecore_event_handler_del(key_info.release_handler);
+               key_info.release_handler = NULL;
+       }
+
+       if (key_info.press_handler) {
+               ecore_event_handler_del(key_info.press_handler);
+               key_info.press_handler = NULL;
+       }
+
+       key_info.register_handler = EINA_FALSE;
+}
+
+
+
+HAPI void key_grab_home(void)
+{
+       if (EINA_TRUE == key_info.home_grabbed) return;
+
+       Ecore_X_Window win = elm_win_xwindow_get(menu_screen_get_win());
+       Display* dpy = ecore_x_display_get();
+
+       int ret = utilx_grab_key(dpy, win, KEY_SELECT, TOP_POSITION_GRAB);
+       ret_if(0 != ret);
+
+       ret = utilx_grab_key(dpy, win, KEY_BACK, TOP_POSITION_GRAB);
+       ret_if(0 != ret);
+
+       key_info.home_grabbed = EINA_TRUE;
+}
+
+
+
+HAPI void key_ungrab_home(void)
+{
+       if (key_info.home_grabbed == EINA_FALSE) return;
+
+       Ecore_X_Window win = elm_win_xwindow_get(menu_screen_get_win());
+       Display* dpy = ecore_x_display_get();
+
+       int ret = utilx_ungrab_key(dpy, win, KEY_SELECT);
+       ret_if(0 != ret);
+
+       ret = utilx_ungrab_key(dpy, win, KEY_BACK);
+       ret_if(0 != ret);
+
+       key_info.home_grabbed = EINA_FALSE;
+}
+
+
+
+// End of a file
index 67449ff7b0dfcdd6cf6189e35f0480f78723e351..881b2563ec09abc0709c37149870127fc57eed16 100644 (file)
@@ -28,6 +28,7 @@
 
 #include "conf.h"
 #include "item.h"
+#include "key.h"
 #include "layout.h"
 #include "mapbuf.h"
 #include "menu_screen.h"
@@ -394,6 +395,7 @@ if (vconf_notify_key_changed(VCONFKEY_SETAPPL_ACCESSIBILITY_TTS, _tts_cb, NULL)
        elm_object_content_set(conformant, layout);
        mouse_register();
        aul_listen_app_dead_signal(_dead_cb, NULL);
+       key_register();
 
        return true;
 }
@@ -415,6 +417,7 @@ static void _terminate_cb(void *data)
 
        evas_object_hide(menu_screen_info.win);
 
+       key_unregister();
        mouse_unregister();
 
        layout = evas_object_data_del(menu_screen_info.win, "layout");
index 0690f966d1d38549e1ad5d2e9bf33a439012b625..2882abd8335553477d112b378407619130b222d8 100644 (file)
 
 
 
-static int _count_pages(Evas_Object *scroller)
-{
-       const Eina_List *children;
-       Evas_Object *box;
-
-       box = evas_object_data_get(scroller, "box");
-       retv_if(NULL == box, 0);
-
-       children = elm_box_children_get(box);
-       return eina_list_count(children);
-}
-
-
-
 HAPI void page_scroller_bring_in(Evas_Object *scroller, int idx)
 {
        Evas_Object *index;
index 60d5fa5d15da182f930f12f7499f46a69e134866..b6405253df916e82ba873d1f308472e01dbe606d 100644 (file)
 #define BUFSZE 1024
 
 
-static void _response_cb(void *data, Evas_Object *obj, void *event_info)
-{
+
+static struct {
        Evas_Object *popup;
+} popup_info = {
+       .popup = NULL,
+};
+
+
+
+HAPI Evas_Object *popup_exist(void)
+{
+       return popup_info.popup;
+}
+
+
+
+HAPI void popup_destroy_all(void)
+{
+       void (*_destroy_popup)(void *data, Evas_Object *obj, void *event_info);
+
+       if (NULL == popup_info.popup) return;
+
+       _destroy_popup = evas_object_data_get(popup_info.popup, "func_destroy_popup");
+       if (_destroy_popup) _destroy_popup(popup_info.popup, NULL, NULL);
+
+       popup_info.popup = NULL;
+}
+
 
+
+static void _response_cb(void *data, Evas_Object *obj, void *event_info)
+{
        ret_if(NULL == data);
-       popup = data;
+
+       Evas_Object *popup = data;
+       evas_object_data_del(popup, "func_destroy_popup");
+       popup_info.popup = NULL;
+
        evas_object_del(evas_object_data_del(popup, "button"));
+       evas_object_smart_callback_del(popup, "block,clicked", _response_cb);
        evas_object_del(popup);
 }
 
 
 
-HAPI Evas_Object *popup_create(Evas_Object *parent, const char *warning)
+HAPI Evas_Object *popup_create_confirm(Evas_Object *parent, const char *warning)
 {
        Evas_Object *popup;
        Evas_Object *btn;
 
        retv_if(NULL == warning, NULL);
 
+       popup_destroy_all();
+
        popup = elm_popup_add(parent);
        retv_if(NULL == popup, NULL);
 
+       evas_object_smart_callback_add(popup, "block,clicked", _response_cb, popup);
+
        btn = elm_button_add(popup);
        if (NULL == btn) {
                evas_object_del(popup);
@@ -61,28 +98,52 @@ HAPI Evas_Object *popup_create(Evas_Object *parent, const char *warning)
 
        elm_object_part_content_set(popup, "button1", btn);
        evas_object_smart_callback_add(btn, "clicked", _response_cb, popup);
-
        evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+
        elm_object_part_text_set(popup, "title,text", D_("IDS_COM_POP_WARNING"));
        elm_object_text_set(popup, warning);
+       elm_popup_orient_set(popup, ELM_POPUP_ORIENT_CENTER);
        evas_object_show(popup);
 
+       evas_object_data_set(popup, "func_destroy_popup", _response_cb);
+       popup_info.popup = popup;
+
        return popup;
 }
 
 
-static void _uninstall_yes_cb(void *data, Evas_Object *obj, void *event_info)
+
+static void _uninstall_no_cb(void *data, Evas_Object *obj, void *event_info)
 {
-       Evas_Object *popup;
-       Evas_Object *item;
+       ret_if(NULL == data);
+
+       Evas_Object *popup = data;
+       evas_object_data_del(popup, "func_destroy_popup");
+       popup_info.popup = NULL;
 
+       evas_object_del(evas_object_data_del(popup, "button1"));
+       evas_object_del(evas_object_data_del(popup, "button2"));
+       evas_object_data_del(popup, "item");
+       evas_object_smart_callback_del(popup, "block,clicked", _uninstall_no_cb);
+       evas_object_del(popup);
+}
+
+
+
+static void _uninstall_yes_cb(void *data, Evas_Object *obj, void *event_info)
+{
        ret_if(NULL == data);
 
-       popup = data;
+       Evas_Object *popup = data;
+       evas_object_data_del(popup, "func_destroy_popup");
+       popup_info.popup = NULL;
+
+       Evas_Object *item;
        item = evas_object_data_del(popup, "item");
 
        evas_object_del(evas_object_data_del(popup, "button1"));
        evas_object_del(evas_object_data_del(popup, "button2"));
+       evas_object_smart_callback_del(popup, "block,clicked", _uninstall_no_cb);
        evas_object_del(popup);
 
        bool is_shortcut = false;
@@ -99,20 +160,6 @@ static void _uninstall_yes_cb(void *data, Evas_Object *obj, void *event_info)
 
 
 
-static void _uninstall_no_cb(void *data, Evas_Object *obj, void *event_info)
-{
-       Evas_Object *popup;
-
-       ret_if(NULL == data);
-       popup = data;
-       evas_object_del(evas_object_data_del(popup, "button1"));
-       evas_object_del(evas_object_data_del(popup, "button2"));
-       evas_object_data_del(popup, "item");
-       evas_object_del(popup);
-}
-
-
-
 #define IDS_AT_POP_UNINSTALL_PS_Q "IDS_AT_POP_UNINSTALL_PS_Q"
 HAPI Evas_Object *popup_create_uninstall(Evas_Object *parent, Evas_Object *item)
 {
@@ -121,10 +168,13 @@ HAPI Evas_Object *popup_create_uninstall(Evas_Object *parent, Evas_Object *item)
        Evas_Object *btn2;
        char warning[BUFSZE];
 
+       popup_destroy_all();
+
        popup = elm_popup_add(parent);
        retv_if(NULL == popup, NULL);
 
        evas_object_data_set(popup, "item", item);
+       evas_object_smart_callback_add(popup, "block,clicked", _uninstall_no_cb, popup);
 
        btn1 = elm_button_add(popup);
        if (NULL == btn1) {
@@ -147,6 +197,8 @@ HAPI Evas_Object *popup_create_uninstall(Evas_Object *parent, Evas_Object *item)
        evas_object_smart_callback_add(btn2, "clicked", _uninstall_no_cb, popup);
 
        evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+       evas_object_data_set(popup, "func_destroy_popup", _uninstall_no_cb);
+       popup_info.popup = popup;
        evas_object_show(popup);
 
        char *name= item_get_name(item);