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>
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");
*
* @date Aug-08-2013
*/
+#include "CicoHomeScreen.h"
#include "CicoHSMenuTouch.h"
#include "CicoSound.h"
bool CicoHSMenuTouch::long_act;
bool CicoHSMenuTouch::touch_down;
+Evas_Object *CicoHSMenuTouch::grabbed_object;
+
CicoHSMenuWindow* CicoHSMenuTouch::menu_window;
/*============================================================================*/
timer = NULL;
long_act = false;
touch_down = false;
+ grabbed_object = NULL;
CicoHSMenuTouch::menu_window = menu_window;
}
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;
}
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;
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();
/*--------------------------------------------------------------------------*/
/**
+ * @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
*
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;
}
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();
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();
*/
/*--------------------------------------------------------------------------*/
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();
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];
static bool long_act;
static bool touch_down;
+ static Evas_Object *grabbed_object;
+
protected:
CicoHSMenuTouch operator=(const CicoHSMenuTouch&);
CicoHSMenuTouch(const CicoHSMenuTouch&);
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);
#include "CicoHSAppInfo.h"
#include "CicoHomeScreen.h"
#include "CicoHSSystemState.h"
+#include "CicoHSMenuTouch.h"
#include "ico_syc_inputctl.h"
#include <linux/input.h>
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;
int width, int height)
{
num_windows = 0;
- touch_down = 0;
+ touch_down = false;
set_xy_pos = false;
ctl_bar_window = ctl_bar;
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) {
touch_state_a_x = x;
touch_state_a_y = y;
}
+
+ CicoHSMenuTouch::SetGrabbedObject(obj);
}
/*--------------------------------------------------------------------------*/
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");
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;
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];
}
}
+//--------------------------------------------------------------------------
+/**
+ * @brief get this class instance
+ */
+//--------------------------------------------------------------------------
+CicoHomeScreen*
+CicoHomeScreen::getInstance(void)
+{
+ return hs_instance;
+}
+
/*--------------------------------------------------------------------------*/
/**
* @brief CicoHomeScreen::ShowHomeScreenLayer
public:
CicoHomeScreen(void);
~CicoHomeScreen(void);
+ static CicoHomeScreen* getInstance(void);
int Initialize(int orientation,CicoGKeyFileConfig *config);
void InitializeAppHistory(void);
void Finalize(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*/
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);