bug fix: TC-115 (same cause TC-89) 37/28337/2
authorRyota Okubi <ryota.okubi@mail.toyota-td.jp>
Fri, 3 Oct 2014 05:18:40 +0000 (14:18 +0900)
committerRyota Okubi <ryota.okubi@mail.toyota-td.jp>
Fri, 3 Oct 2014 06:17:09 +0000 (15:17 +0900)
TC-115 - Click app has no response after switching app for many times.
(same cause TC-89)
EFL has managed the grab of a pointer per drawing parts.
However, if a pointer is moved to another surface while the touch panel
was pushed and drawing parts have held the glab, the event which
detached the touch panel forever will not come to EFL.
Although a means to avoid this is prepared for EFL, since the
processing was not mounted in HomeScreen, while the parts pushed first
have held the glab, even if it pushes other parts, touch operation
loses its effect.
When repair moved to surface of an exception, with a touch panel
pushed, it corresponded by releasing the glab of EFL.

Change-Id: I2afb85eb14f9814b533f67c658755ad63a63ad24
Bug-Tizen: TC-115 TC-89
Signed-off-by: Ryota Okubi <ryota.okubi@mail.toyota-td.jp>
src/homescreen/CicoHSControlBarTouch.cpp
src/homescreen/CicoHSMenuTouch.cpp
src/homescreen/CicoHSMenuTouch.h
src/homescreen/CicoHSMenuWindow.cpp
src/homescreen/CicoHSSwipeTouch.cpp
src/homescreen/CicoHSSwipeTouch.h
src/homescreen/CicoHomeScreen.cpp
src/homescreen/CicoHomeScreen.h
src/onscreen/CicoOSPopWindow.cpp
src/statusbar/CicoStatusBar.cpp

index 048f710..ea3d1ac 100644 (file)
@@ -88,21 +88,25 @@ void
 CicoHSControlBarTouch::TouchUpControlBar(void *data, Evas *evas,
                                          Evas_Object *obj, void *event_info)
 {
+    Evas_Event_Mouse_Down *info = reinterpret_cast<Evas_Event_Mouse_Down*>(event_info);
+
     ICO_DBG("CicoHSControlBarTouch::TouchUpControlBar Enter(down=%d)",
             (int)touch_down);
 
     if (touch_down == false)    {
-        // multi touch up, skiep
-        ICO_DBG("CicoHSControlBarTouch::TouchUpControlBar not down, Skip");
+        ICO_DBG("CicoHSControlBarTouch::TouchUpControlBar No Down");
+        // Menu manipulation is normally processed, even if there is no touchdown.
     }
     touch_down = false;
 
     if (data == NULL) {
-        ICO_PRF("TOUCH_EVENT Ctrl-Bar Down->Up app=(NIL)");
+        ICO_PRF("TOUCH_EVENT Ctrl-Bar Down->Up (%d,%d) app=(NIL)",
+                info->output.x, info->output.y);
         ctl_bar_window->TouchHome();
     }
     else {
-        ICO_PRF("TOUCH_EVENT Ctrl-Bar Down->Up app=%s", (const char *)data);
+        ICO_PRF("TOUCH_EVENT Ctrl-Bar Down->Up (%d,%d) app=%s",
+                info->output.x, info->output.y, (const char *)data);
         ctl_bar_window->TouchShortcut((const char *)data);
     }
     ICO_DBG("CicoHSControlBarTouch::TouchUpControlBar Leave");
index 92e5cd4..dd9461e 100644 (file)
@@ -11,6 +11,7 @@
  *
  * @date    Aug-08-2013
  */
+#include "CicoHomeScreen.h"
 #include "CicoHSMenuTouch.h"
 #include "CicoSound.h"
 
@@ -27,6 +28,8 @@ Ecore_Timer *CicoHSMenuTouch::timer;
 bool CicoHSMenuTouch::long_act;
 bool CicoHSMenuTouch::touch_down;
 
+Evas_Object *CicoHSMenuTouch::grabbed_object;
+
 CicoHSMenuWindow* CicoHSMenuTouch::menu_window;
 
 /*============================================================================*/
@@ -47,6 +50,7 @@ CicoHSMenuTouch::Initialize(CicoHSMenuWindow* menu_window)
     timer = NULL;
     long_act = false;
     touch_down = false;
+    grabbed_object = NULL;
 
     CicoHSMenuTouch::menu_window = menu_window;
 }
@@ -131,13 +135,20 @@ Eina_Bool
 CicoHSMenuTouch::LongPushed(void *data)
 {
     ICO_TRA("CicoHSMenuTouch::LongPushed Enter");
-    long_act = true;
     timer = NULL;
 
-    /*stop select*/
-    menu_window->ChangeTerminateMode();
+    if (CicoHomeScreen::getInstance()->GetMode() == ICO_HS_MODE_MENU)   {
+        long_act = true;
+
+        /*stop select*/
+        menu_window->ChangeTerminateMode();
 
-    ICO_TRA("CicoHSMenuTouch::LongPushed Leave");
+        ICO_TRA("CicoHSMenuTouch::LongPushed Leave");
+    }
+    else    {
+        long_act = false;
+        ICO_TRA("CicoHSMenuTouch::LongPushed Leave(Not in Menu)");
+    }
     return ECORE_CALLBACK_CANCEL;
 }
 
@@ -171,8 +182,10 @@ CicoHSMenuTouch::TouchUpMenu(void *data, Evas *evas, Evas_Object *obj, void *eve
         timer = NULL;
     }
     else if (touch_down == false)   {
-        ICO_DBG("CicoHSMenuTouch::TouchUpMenu: (%d,%d) No Down, Skip", x, y);
-        return;
+        ICO_DBG("CicoHSMenuTouch::TouchUpMenu: (%d,%d) No Down", x, y);
+        // Menu manipulation is normally processed, even if there is no touchdown.
+        touch_state_b_x = x;
+        touch_state_b_y = y;
     }
     touch_down = false;
 
@@ -194,7 +207,6 @@ CicoHSMenuTouch::TouchUpMenu(void *data, Evas *evas, Evas_Object *obj, void *eve
             touch_state_a_x, touch_state_a_y, appid ? appid: "(NULL)");
 
     if (abs(sub_x) > abs(sub_y)) {
-
         /* menu slide*/
         if (sub_x > ICO_HS_MENU_TOUCH_FLICK_THREASHOLD_DISTANCE) {
             menu_window->GoBackMenu();
@@ -235,6 +247,63 @@ CicoHSMenuTouch::TouchUpMenu(void *data, Evas *evas, Evas_Object *obj, void *eve
 
 /*--------------------------------------------------------------------------*/
 /**
+ * @brief   CicoHSMenuTouch::FocusOutEvas
+ *          focus out at menu evas
+ *
+ * @param[in]   data        data(canvas object, unused)
+ * @param[in]   evas        evas(unused)
+ * @param[in]   event_info  event information(unused)
+ * @return      none
+ */
+/*--------------------------------------------------------------------------*/
+void
+CicoHSMenuTouch::FocusOutEvas(void *data, Evas *evas, void *event_info)
+{
+    // Ungrab focus
+    if (grabbed_object) {
+        evas_object_focus_set(grabbed_object, EINA_FALSE);
+        grabbed_object = NULL;
+    }
+
+    // Focus Out, Cancel menu touch
+    if (timer != NULL) {
+        // delete timer
+        ecore_timer_del(timer);
+        timer = NULL;
+    }
+    else if (touch_down == false)   {
+        ICO_DBG("CicoHSMenuTouch::FocusOutEvas: No Down, Skip");
+        return;
+    }
+    touch_down = false;
+
+    if (long_act)   {
+        // Stop Terminate Mode
+        long_act = false;
+        menu_window->ChangeNormalMode();
+    }
+
+    ICO_PRF("TOUCH_EVENT Menu FocusOut(Evas)");
+}
+
+/*--------------------------------------------------------------------------*/
+/**
+ * @brief   CicoHSMenuTouch::SetGrabbedObject
+ *          set/reset grabbed Evas Object
+ *
+ * @param[in]   object      grabbed Evas object or NULL
+ * @return      none
+ */
+/*--------------------------------------------------------------------------*/
+void
+CicoHSMenuTouch::SetGrabbedObject(Evas_Object *object)
+{
+    ICO_DBG("CicoHSMenuTouch::SetGrabbedObject %p", object);
+    grabbed_object = object;
+}
+
+/*--------------------------------------------------------------------------*/
+/**
  * @brief   CicoHSMenuTouch::TouchDownTerm
  *          touch down action at terminate icon
  *
@@ -248,7 +317,11 @@ CicoHSMenuTouch::TouchUpMenu(void *data, Evas *evas, Evas_Object *obj, void *eve
 void
 CicoHSMenuTouch::TouchDownTerm(void *data, Evas *evas, Evas_Object *obj, void *event_info)
 {
-    ICO_DBG("CicoHSMenuTouch::TouchDownTerm:");
+    Evas_Event_Mouse_Down *info = reinterpret_cast<Evas_Event_Mouse_Down*>(event_info);
+    char *appid = reinterpret_cast<char*>(data);
+
+    ICO_PRF("TOUCH_EVENT Term Down (%d,%d) app=%s",
+            info->output.x, info->output.y, appid ? appid : "(NIL)");
     touch_down = true;
 }
 
@@ -267,20 +340,20 @@ CicoHSMenuTouch::TouchDownTerm(void *data, Evas *evas, Evas_Object *obj, void *e
 void
 CicoHSMenuTouch::TouchUpTerm(void *data, Evas *evas, Evas_Object *obj, void *event_info)
 {
-    // if no down, skip
-    ICO_DBG("CicoHSMenuTouch::TouchUpTerm: down=%d", (int)touch_down);
+    Evas_Event_Mouse_Down *info = reinterpret_cast<Evas_Event_Mouse_Down*>(event_info);
+    char *appid = reinterpret_cast<char*>(data);
+
+    ICO_PRF("TOUCH_EVENT Term Up   (%d,%d) app=%s",
+            info->output.x, info->output.y, appid ? appid : "(NIL)");
     if (touch_down == false)    {
-        ICO_DBG("CicoHSMenuTouch::TouchUpTerm: No Down, Skip");
-        return;
+        ICO_DBG("CicoHSMenuTouch::TouchUpTerm: No Down");
+        // Menu manipulation is normally processed, even if there is no touchdown.
     }
     touch_down = false;
 
     // play opration sound
     CicoSound::GetInstance()->PlayOperationSound();
 
-    char *appid = reinterpret_cast<char*>(data);
-    ICO_PRF("TOUCH_EVENT Term Down->Up app=%s", appid ? appid : "(NIL)");
-
     strncpy(terminate_appid, appid, ICO_HS_MAX_PROCESS_NAME);
 
     menu_window->ShowTerminateButton();
@@ -302,7 +375,10 @@ void
 CicoHSMenuTouch::TouchUpTerminateYes(void *data, Evas *evas, Evas_Object *obj,
                                      void *event_info)
 {
-    ICO_PRF("TOUCH_EVENT TermYes Up app=%s", terminate_appid);
+    Evas_Event_Mouse_Down *info = reinterpret_cast<Evas_Event_Mouse_Down*>(event_info);
+
+    ICO_PRF("TOUCH_EVENT TermYes (%d,%d) app=%s",
+            info->output.x, info->output.y, terminate_appid);
 
     // play opration sound
     CicoSound::GetInstance()->PlayOperationSound();
@@ -322,9 +398,13 @@ CicoHSMenuTouch::TouchUpTerminateYes(void *data, Evas *evas, Evas_Object *obj,
  */
 /*--------------------------------------------------------------------------*/
 void
-CicoHSMenuTouch::TouchUpTerminateNo(void *data, Evas *evas, Evas_Object *obj, void *event_info)
+CicoHSMenuTouch::TouchUpTerminateNo(void *data, Evas *evas, Evas_Object *obj,
+                                    void *event_info)
 {
-    ICO_PRF("TOUCH_EVENT TermNo Up app=%s", terminate_appid);
+    Evas_Event_Mouse_Down *info = reinterpret_cast<Evas_Event_Mouse_Down*>(event_info);
+
+    ICO_PRF("TOUCH_EVENT TermNo (%d,%d) app=%s",
+            info->output.x, info->output.y, terminate_appid);
 
     // play opration sound
     CicoSound::GetInstance()->PlayOperationSound();
index 33f6cd8..ba09800 100644 (file)
@@ -32,13 +32,13 @@ class CicoHSMenuTouch
     static void Finalize(void);
     static void TouchDownMenu(void *data, Evas *evas, Evas_Object *obj, void *event_info); 
     static void TouchUpMenu(void *data, Evas *evas, Evas_Object *obj, void *event_info);
-
+    static void FocusOutEvas(void *data, Evas *evas, void *event_info);
     static void TouchDownTerm(void *data, Evas *evas, Evas_Object *obj, void *event_info); 
     static void TouchUpTerm(void *data, Evas *evas, Evas_Object *obj, void *event_info);
-
     static void TouchUpTerminateYes(void *data, Evas *evas, Evas_Object *obj, void *event_info);
     static void TouchUpTerminateNo(void *data, Evas *evas, Evas_Object *obj, void *event_info);
     static Eina_Bool LongPushed(void *data);
+    static void SetGrabbedObject(Evas_Object *object);
 
   private:
     static char terminate_appid[ICO_HS_MAX_PROCESS_NAME];
@@ -53,6 +53,8 @@ class CicoHSMenuTouch
     static bool long_act;
     static bool touch_down;
 
+    static Evas_Object  *grabbed_object;
+
   protected:
     CicoHSMenuTouch operator=(const CicoHSMenuTouch&);
     CicoHSMenuTouch(const CicoHSMenuTouch&);
index d4fcb70..ed50c4d 100644 (file)
@@ -124,6 +124,8 @@ CicoHSMenuWindow::SetMenuBack(void)
                                    CicoHSMenuTouch::TouchDownMenu,NULL);
     evas_object_event_callback_add(canvas, EVAS_CALLBACK_MOUSE_UP,
                                    CicoHSMenuTouch::TouchUpMenu,NULL);
+    evas_event_callback_add(evas, EVAS_CALLBACK_CANVAS_FOCUS_OUT,
+                            CicoHSMenuTouch::FocusOutEvas, (void *)canvas);
     evas_object_move(canvas, 0, 0);
     evas_object_resize(canvas, width, height);
     evas_object_show(canvas);
index 1580c15..cce3d85 100644 (file)
@@ -15,6 +15,7 @@
 #include "CicoHSAppInfo.h"
 #include "CicoHomeScreen.h"
 #include "CicoHSSystemState.h"
+#include "CicoHSMenuTouch.h"
 #include "ico_syc_inputctl.h"
 #include <linux/input.h>
 
@@ -30,7 +31,7 @@ int CicoHSSwipeTouch::touch_state_b_y;
 int CicoHSSwipeTouch::touch_state_a_x;
 int CicoHSSwipeTouch::touch_state_a_y;
 
-int CicoHSSwipeTouch::touch_down;
+bool CicoHSSwipeTouch::touch_down;
 bool CicoHSSwipeTouch::set_xy_pos;
 
 int CicoHSSwipeTouch::num_windows;
@@ -56,7 +57,7 @@ CicoHSSwipeTouch::Initialize(CicoHSControlBarWindow* ctl_bar, CicoHSAppHistoryEx
                              int width, int height)
 {
     num_windows = 0;
-    touch_down = 0;
+    touch_down = false;
     set_xy_pos = false;
 
     ctl_bar_window = ctl_bar;
@@ -101,14 +102,14 @@ CicoHSSwipeTouch::TouchDownSwipe(void *data, Evas *evas, Evas_Object *obj, void
     CicoHSSwipeInputWindow  *window;
     int     x, y;
 
-    touch_down ++;
+    touch_down = true;
 
     info = reinterpret_cast<Evas_Event_Mouse_Down*>(event_info);
     window = (CicoHSSwipeInputWindow *)data;
     x = info->output.x + window->GetPosX();
     y = info->output.y + window->GetPosY();
-    ICO_PRF("TOUCH_EVENT Swipe Down (%d,%d)->(%d,%d) (%d)",
-            info->output.x, info->output.y, x, y, touch_down);
+    ICO_PRF("TOUCH_EVENT Swipe Down (%d,%d)->(%d,%d)",
+            info->output.x, info->output.y, x, y);
 
     if ((x >= 0) && (x < 4096) && (y >= 0) && (y < 4096))   {
         if (set_xy_pos == false)    {
@@ -119,6 +120,8 @@ CicoHSSwipeTouch::TouchDownSwipe(void *data, Evas *evas, Evas_Object *obj, void
         touch_state_a_x = x;
         touch_state_a_y = y;
     }
+
+    CicoHSMenuTouch::SetGrabbedObject(obj);
 }
 
 /*--------------------------------------------------------------------------*/
@@ -157,23 +160,19 @@ CicoHSSwipeTouch::TouchUpSwipe(void *data, Evas *evas, Evas_Object *obj, void *e
         touch_state_a_y = y;
     }
 
-    ICO_PRF("TOUCH_EVENT Swipe Up   (%d,%d)->(%d,%d) before(%d,%d) (%d)",
-            info->output.x, info->output.y, touch_state_a_x, touch_state_a_y,
-            touch_state_b_x, touch_state_b_y, touch_down - 1);
+    CicoHSMenuTouch::SetGrabbedObject(NULL);
 
-    if (touch_down > 1) {
-        touch_down --;
-        ICO_DBG("TouchUpSwipe: touch counter not 0(%d), Skip", touch_down);
-        return;
-    }
+    ICO_PRF("TOUCH_EVENT Swipe Up   (%d,%d)->(%d,%d) before(%d,%d)",
+            info->output.x, info->output.y, touch_state_a_x, touch_state_a_y,
+            touch_state_b_x, touch_state_b_y);
 
-    if (touch_down == 0)    {
+    if (touch_down == false)    {
         set_xy_pos = false;
-        ICO_DBG("TouchUpSwipe: no touch down, Skip");
+        ICO_DBG("TouchUpSwipe: No Down, Skip");
         return;
     }
 
-    touch_down --;
+    touch_down = false;
 
     if (set_xy_pos == false)    {
         ICO_DBG("TouchUpSwipe: unknown coordinate, Skip");
@@ -436,7 +435,7 @@ CicoHSSwipeTouch::TouchMoveSwipe(void *data, Evas *evas, Evas_Object *obj, void
     touch_state_a_x = x;
     touch_state_a_y = y;
 
-    if ((set_xy_pos == false) || (touch_down == 0)) {
+    if ((set_xy_pos == false) || (touch_down == false)) {
         set_xy_pos = true;
         touch_state_b_x = touch_state_a_x;
         touch_state_b_y = touch_state_a_y;
index 4f5a0bc..4240566 100644 (file)
@@ -53,7 +53,7 @@ class CicoHSSwipeTouch
     static int touch_state_a_x;
     static int touch_state_a_y;
 
-    static int touch_down;
+    static bool touch_down;
     static bool set_xy_pos;
     static int num_windows;
     static CicoHSSwipeInputWindow* swipe_windows[ICO_HS_MAX_SWIPEWINDOWS];
index 9b64cfb..781048d 100644 (file)
@@ -110,6 +110,17 @@ CicoHomeScreen::~CicoHomeScreen(void)
     }
 }
 
+//--------------------------------------------------------------------------
+/**
+ *  @brief  get this class instance
+ */
+//--------------------------------------------------------------------------
+CicoHomeScreen*
+CicoHomeScreen::getInstance(void)
+{
+    return hs_instance;
+}
+
 /*--------------------------------------------------------------------------*/
 /**
  * @brief   CicoHomeScreen::ShowHomeScreenLayer
index 52c0432..32fc1c7 100644 (file)
@@ -75,6 +75,7 @@ class CicoHomeScreen
   public:
     CicoHomeScreen(void);
     ~CicoHomeScreen(void);
+    static CicoHomeScreen* getInstance(void);
     int Initialize(int orientation,CicoGKeyFileConfig *config);
     void InitializeAppHistory(void);
     void Finalize(void);
index 3c50f3b..ffd563e 100644 (file)
@@ -295,6 +295,7 @@ CicoOSPopWindow::InitializeWindow(void)
     }
     // icon setup
     m_icon = evas_object_image_filled_add(ecore_evas_get(m_window));
+    evas_object_pointer_mode_set(m_icon, EVAS_OBJECT_POINTER_MODE_NOGRAB);
     edje_object_part_swallow(m_theme, "icon", m_icon);
     /* getting size of screen */
     /* home screen size is full of display*/
index e13276b..234992e 100644 (file)
@@ -92,6 +92,7 @@ CicoStatusBar::Initialize(void)
 
     ICO_DBG("Initialize start windowobj_.");
     windowobj_ = evas_object_rectangle_add(ecore_evas_get(window_));
+    evas_object_pointer_mode_set(windowobj_, EVAS_OBJECT_POINTER_MODE_NOGRAB);
 
     // statusbar RGBcolor setting
     evas_object_color_set(windowobj_, 0, 0, 0, 255);