[Fix] User can access US menu via touch display. 85/166085/8
authorPawel Kurowski <p.kurowski2@samsung.com>
Fri, 5 Jan 2018 19:38:56 +0000 (20:38 +0100)
committerLukasz Oleksak <l.oleksak@samsung.com>
Thu, 1 Feb 2018 10:41:29 +0000 (10:41 +0000)
Small inconvenience connected to this solution:
gestures must be added by timer (the choice of delay is irrelevant)

With timer, function will be queued in main loop,
and executed later than change of input region,
allowing gesture to be passed to application below Universal Switch.

Change-Id: Ib774e65fc85bbc949b6b1c1c74a8a0adca4cd77d

src/GestureActivity.cpp
src/SelectActivity.cpp
src/Window.cpp
src/Window.hpp

index 1cd60cc..581a286 100644 (file)
@@ -21,6 +21,7 @@
 #include "UniversalSwitch.hpp"
 #include "Window.hpp"
 #include "utils.hpp"
+#include "ecore.hpp"
 
 static constexpr int DEFAULT_STEPS_NUMBER = 20;                //DispatchDragEvent will generate 20 middle steps between start and end point
 static constexpr int NO_DELAY = 0.0;
@@ -62,6 +63,7 @@ public:
 
 protected:
        std::vector<std::shared_ptr<UIElement>> uiElements;
+       ecore::Timer timer;
 };
 
 template <typename DerivedType>
@@ -70,16 +72,19 @@ class TouchDispatcher : public GestureDispatcher<DerivedType>
 public:
        using GestureDispatcher<DerivedType>::uiElements;
        using GestureDispatcher<DerivedType>::markAsCompleted;
+       using GestureDispatcher<DerivedType>::timer;
        static constexpr unsigned int requiredArguments = 1;
 
        void process(DoneCallback doneCb) override
        {
-               ASSERT(uiElements.size() == requiredArguments);
-               auto coord = uiElements.front()->getScanningCoordinates();
-
-               utils::EventGenerator::generateTapGesture(coord.x, coord.y, DerivedType::hold_time);
-               doneCb.callAfterTimeElapsed(sideEffectDelays::eModGesture);
-               markAsCompleted();
+               timer.reset(NO_DELAY, [this, doneCb = std::move(doneCb)]() {
+                       ASSERT(uiElements.size() == requiredArguments);
+                       auto coord = uiElements.front()->getScanningCoordinates();
+                       utils::EventGenerator::generateTapGesture(coord.x, coord.y, DerivedType::hold_time);
+                       doneCb.callAfterTimeElapsed(sideEffectDelays::eModGesture);
+                       markAsCompleted();
+                       return ecore::TimerRepetitionPolicy::cancel;
+               });
        }
 };
 
@@ -103,18 +108,22 @@ class SwipeDispatcher : public GestureDispatcher<DerivedType>
 public:
        using GestureDispatcher<DerivedType>::uiElements;
        using GestureDispatcher<DerivedType>::markAsCompleted;
+       using GestureDispatcher<DerivedType>::timer;
        static constexpr int requiredArguments = 1;
 
        void process(DoneCallback doneCb) override
        {
-               ASSERT(uiElements.size() == requiredArguments);
+               timer.reset(NO_DELAY, [this, doneCb = std::move(doneCb)]() {
+                       ASSERT(uiElements.size() == requiredArguments);
 
-               auto from = getStartPoint();
-               auto to = getEndPoint();
+                       auto from = getStartPoint();
+                       auto to = getEndPoint();
 
-               utils::EventGenerator::generateDragGesture(from.x, from.y, to.x, to.y, DEFAULT_STEPS_NUMBER, NO_DELAY);
-               doneCb.callAfterTimeElapsed(sideEffectDelays::eModGesture);
-               markAsCompleted();
+                       utils::EventGenerator::generateDragGesture(from.x, from.y, to.x, to.y, DEFAULT_STEPS_NUMBER, NO_DELAY);
+                       doneCb.callAfterTimeElapsed(sideEffectDelays::eModGesture);
+                       markAsCompleted();
+                       return ecore::TimerRepetitionPolicy::cancel;
+               });
        }
 
 protected:
@@ -222,18 +231,22 @@ class DragDispatcher : public GestureDispatcher<DerivedType>
 public:
        using GestureDispatcher<DerivedType>::uiElements;
        using GestureDispatcher<DerivedType>::markAsCompleted;
+       using GestureDispatcher<DerivedType>::timer;
        static constexpr int requiredArguments = 2;
 
        void process(DoneCallback doneCb) override
        {
-               ASSERT(uiElements.size() == requiredArguments);
+               timer.reset(NO_DELAY, [this, doneCb = std::move(doneCb)]() {
+                       ASSERT(uiElements.size() == requiredArguments);
 
-               auto from = uiElements.front()->getScanningCoordinates();
-               auto to = uiElements.back()->getScanningCoordinates();
+                       auto from = uiElements.front()->getScanningCoordinates();
+                       auto to = uiElements.back()->getScanningCoordinates();
 
-               utils::EventGenerator::generateDragGesture(from.x, from.y, to.x, to.y, DerivedType::steps, DerivedType::hold_time);
-               doneCb.callAfterTimeElapsed(sideEffectDelays::eModGesture);
-               markAsCompleted();
+                       utils::EventGenerator::generateDragGesture(from.x, from.y, to.x, to.y, DerivedType::steps, DerivedType::hold_time);
+                       doneCb.callAfterTimeElapsed(sideEffectDelays::eModGesture);
+                       markAsCompleted();
+                       return ecore::TimerRepetitionPolicy::cancel;
+               });
        }
 };
 
@@ -259,16 +272,20 @@ class PinchDispatcher : public GestureDispatcher<DerivedType>
 public:
        using GestureDispatcher<DerivedType>::uiElements;
        using GestureDispatcher<DerivedType>::markAsCompleted;
+       using GestureDispatcher<DerivedType>::timer;
        static constexpr int requiredArguments = 1;
 
        void process(DoneCallback doneCb) override
        {
-               ASSERT(GestureDispatcher<DerivedType>::uiElements.size() == requiredArguments);
-               auto coord = GestureDispatcher<DerivedType>::uiElements.front()->getScanningCoordinates();
-
-               utils::EventGenerator::generatePinchGesture(coord.x, coord.y, DerivedType::radius_change, DEFAULT_STEPS_NUMBER);
-               doneCb.callAfterTimeElapsed(sideEffectDelays::eModGesture);
-               markAsCompleted();
+               timer.reset(NO_DELAY, [this, doneCb = std::move(doneCb)]() {
+                       ASSERT(GestureDispatcher<DerivedType>::uiElements.size() == requiredArguments);
+                       auto coord = GestureDispatcher<DerivedType>::uiElements.front()->getScanningCoordinates();
+
+                       utils::EventGenerator::generatePinchGesture(coord.x, coord.y, DerivedType::radius_change, DEFAULT_STEPS_NUMBER);
+                       doneCb.callAfterTimeElapsed(sideEffectDelays::eModGesture);
+                       markAsCompleted();
+                       return ecore::TimerRepetitionPolicy::cancel;
+               });
        }
 };
 
index 552256a..4f741ae 100644 (file)
@@ -159,7 +159,7 @@ void SelectActivity::update(const std::shared_ptr<UIElement> &elem)
                screenScannerManager->cancelForcingScanningMethod();
        if (isMenuShown()) {
                ASSERT(!realUiElements.empty());
-               elem->activate({}); /*elem is popup menu item*/
+               notify(std::make_shared<ActivityChangeRequest>("TAP", std::vector<std::shared_ptr<UIElement>> {elem})); /*elem is popup menu item*/
                return;
        }
 
@@ -235,6 +235,7 @@ void SelectActivity::createMenu()
                removeMenu();
        });
 
+       Singleton<UniversalSwitch>::instance().getMainWindow()->acceptTouchInput(true);
        evas_object_show(popup.get());
        timer.reset();
 }
@@ -246,6 +247,7 @@ bool SelectActivity::isMenuShown() const
 
 void SelectActivity::removeMenu()
 {
+       Singleton<UniversalSwitch>::instance().getMainWindow()->acceptTouchInput(false);
        callbackHandle.reset();
 
        for (auto &e : gengridItemsData)
index 89de9f6..a17a006 100644 (file)
@@ -30,12 +30,12 @@ Window::Window()
        }
 
        handler.reset(windowHandler);
+       waylandWindow = elm_win_wl_window_get(windowHandler);
 
        // TODO: name setter should be removed after reaching full functionality by navigation interface
        elm_atspi_accessible_name_set(windowHandler, "UniversalSwitch Main Window");
 
        efl_util_set_notification_window_level(windowHandler, EFL_UTIL_NOTIFICATION_LEVEL_3);
-       elm_win_override_set(windowHandler, EINA_TRUE);
        elm_win_alpha_set(windowHandler, EINA_TRUE);
 
        auto size = getDimensions().size;
@@ -44,9 +44,7 @@ Window::Window()
        elm_win_wm_rotation_available_rotations_set(windowHandler, rotations, 3);
        evas_object_show(windowHandler);
 
-       waylandWindow = elm_win_wl_window_get(windowHandler);
-       ecore_wl_window_input_region_set(waylandWindow, 0, 0, 0, 0);
-       ecore_wl_window_focus_skip_set(waylandWindow, EINA_TRUE);
+       acceptTouchInput(false);
 
        auto status = efl_util_set_window_screen_mode(windowHandler, EFL_UTIL_SCREEN_MODE_ALWAYS_ON);
        if (status)
@@ -93,3 +91,16 @@ Quickpanel *Window::getQuickpanel() const
 {
        return quickpanel.get();
 }
+
+void Window::acceptTouchInput(bool state)
+{
+       elm_win_override_set(handler.get(), state ? EINA_FALSE : EINA_TRUE);
+       ecore_wl_window_focus_skip_set(waylandWindow, state ? EINA_FALSE : EINA_TRUE);
+       auto size = 0;
+       if (state) {
+               auto dimensions = getDimensions();
+               size = std::max(dimensions.size.width, dimensions.size.height);
+       }
+
+       ecore_wl_window_input_region_set(waylandWindow, 0, 0, size, size);
+}
index 0a41f70..a70c26e 100644 (file)
@@ -34,6 +34,7 @@ public:
        Rectangle getDimensions() const;
        Quickpanel *getQuickpanel() const;
        void bringToFront();
+       void acceptTouchInput(bool);
 
 private:
        static void removeHandler(Evas_Object *handler);