set keygrab home key 08/45508/3
authorSoohye Shin <soohye.shin@samsung.com>
Fri, 7 Aug 2015 04:02:28 +0000 (13:02 +0900)
committerSoohye Shin <soohye.shin@samsung.com>
Fri, 7 Aug 2015 04:47:57 +0000 (13:47 +0900)
Change-Id: I5899b0fa7bd8ac393fc61265f8a97bb12bcc0c4a
Signed-off-by: Soohye Shin <soohye.shin@samsung.com>
CMakeLists.txt
packaging/org.tizen.home.spec
src/main.c

index c19a6b5..54bddcc 100644 (file)
@@ -71,6 +71,7 @@ pkg_check_modules(PKGS REQUIRED
                pkgmgr-info
                notification
                tv-service
+               ecore-wayland
                capi-appfw-application)
 
 FOREACH(flag ${PKGS_CFLAGS})
index 4a5f5b0..102abf4 100644 (file)
@@ -19,6 +19,7 @@ BuildRequires: pkgconfig(app-utils)
 BuildRequires: pkgconfig(pkgmgr-info)
 BuildRequires: pkgconfig(tv-service)
 BuildRequires: pkgconfig(notification)
+BuildRequires: pkgconfig(ecore-wayland)
 BuildRequires: edje-bin
 BuildRequires: gettext-devel
 
index 03922c7..9862dc4 100644 (file)
@@ -19,6 +19,7 @@
 #include <app_debug.h>
 #include <viewmgr.h>
 #include <key_define.h>
+#include <Ecore_Wayland.h>
 
 #include "defs.h"
 #include "view.h"
@@ -30,8 +31,11 @@ SET_TAG(PACKAGE);
 
 struct _appdata {
        const char *name;
+
        Evas_Object *win;
+       Eina_Bool activated;
        Ecore_Event_Handler *key_down;
+       Ecore_Event_Handler *focus_out;
 };
 
 static Evas_Object *_add_win(const char *name)
@@ -49,8 +53,38 @@ static Evas_Object *_add_win(const char *name)
        return win;
 }
 
+static void _hide(struct _appdata *ad)
+{
+       viewmgr_hide_view(VIEW_HOME);
+       viewmgr_hide_view(VIEW_RECENT);
+
+       elm_win_iconified_set(ad->win, EINA_TRUE);
+       ad->activated = EINA_FALSE;
+}
+
+static void _show(struct _appdata *ad)
+{
+       elm_win_activate(ad->win);
+       ad->activated = EINA_TRUE;
+
+       viewmgr_push_view(VIEW_HOME);
+}
+
+static Eina_Bool _focus_out(void *data, int type, void *event)
+{
+       if (!data) {
+               _ERR("Invalid argument");
+               return ECORE_CALLBACK_CANCEL;
+       }
+
+       _hide(data);
+
+       return ECORE_CALLBACK_RENEW;
+}
+
 static Eina_Bool _key_down(void *data, int type, void *ei)
 {
+       struct _appdata *ad;
        Evas_Event_Key_Down *ev;
 
        if (!data || !ei) {
@@ -59,10 +93,20 @@ static Eina_Bool _key_down(void *data, int type, void *ei)
        }
 
        ev = ei;
+       ad = data;
 
        if (!strcmp(ev->keyname, KEY_POWER_REMOTE)) {
                utils_launch_app(PACKAGE_INFOSQUARE, KEY_INFOSQUARE,
                                VALUE_INFOSQUARE);
+       } else if (!strcmp(ev->keyname, KEY_HOME)) {
+               if (!ad->activated)
+                       _show(ad);
+       } else if (!strcmp(ev->keyname, KEY_BACK) ||
+                       !strcmp(ev->keyname, KEY_BACK_REMOTE)) {
+               if (ad->activated && viewmgr_active_view_count() == 1 &&
+                               viewmgr_get_view_state(VIEW_HOME) ==
+                                               VIEW_STATE_VISIBLE)
+                       _hide(ad);
        }
 
        return ECORE_CALLBACK_CANCEL;
@@ -78,11 +122,11 @@ static Eina_Bool _key_timer(void *data)
 
        elm_win_keygrab_set(data, KEY_POWER_REMOTE, 0, 0, 0,
                        ELM_WIN_KEYGRAB_EXCLUSIVE);
+       elm_win_keygrab_set(data, KEY_HOME, 0, 0, 0, ELM_WIN_KEYGRAB_EXCLUSIVE);
 
        return ECORE_CALLBACK_CANCEL;
 }
 
-
 static bool _create(void *user_data)
 {
        struct _appdata *ad;
@@ -117,6 +161,9 @@ static bool _create(void *user_data)
 
        ad->key_down = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, _key_down,
                        ad);
+       ad->focus_out = ecore_event_handler_add(ECORE_WL_EVENT_FOCUS_OUT,
+                       _focus_out, ad);
+
        return true;
 }
 
@@ -130,10 +177,13 @@ static void _terminate(void *user_data)
        ad = user_data;
 
        if (ad->win) {
-               if(ad->key_down)
+               if (ad->key_down)
                        ecore_event_handler_del(ad->key_down);
+               if (ad->focus_out)
+                       ecore_event_handler_del(ad->focus_out);
 
                elm_win_keygrab_unset(ad->win, KEY_POWER_REMOTE, 0, 0);
+               elm_win_keygrab_unset(ad->win, KEY_HOME, 0, 0);
                viewmgr_destroy();
                evas_object_del(ad->win);
        }
@@ -161,9 +211,7 @@ static void _control(app_control_h app_control, void *user_data)
        ad = user_data;
 
        if (ad->win)
-               elm_win_activate(ad->win);
-
-       viewmgr_push_view(VIEW_HOME);
+               _show(ad);
 }
 
 int main(int argc, char **argv)