END_TEST;
}
+int UtcDaliSceneSignalKeyEventMonitorP(void)
+{
+ TestApplication application;
+ Dali::Integration::Scene scene = application.GetScene();
+
+ KeyEventSignalData data;
+ KeyEventReceivedFunctor functor(data);
+ scene.KeyEventSignal().Connect(&application, functor);
+
+ KeyEventSignalData monitorData;
+ KeyEventReceivedFunctor monitorFunctor(monitorData);
+ scene.KeyEventMonitorSignal().Connect(&application, monitorFunctor);
+
+ Integration::KeyEvent event("i", "", "i", 0, 0, 0, Integration::KeyEvent::DOWN, "i", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE);
+ application.ProcessEvent(event);
+
+ DALI_TEST_EQUALS(false, monitorData.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+
+ data.Reset();
+ monitorData.Reset();
+
+ Integration::KeyEvent event3("a", "", "a", 0, 0, 0, Integration::KeyEvent::DOWN, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE);
+ event3.receiveTime = 330;
+ application.ProcessEvent(event3);
+
+ DALI_TEST_EQUALS(true, monitorData.functorCalled, TEST_LOCATION);
+ DALI_TEST_CHECK(event3.keyModifier == monitorData.receivedKeyEvent.GetKeyModifier());
+ DALI_TEST_CHECK(event3.keyName == monitorData.receivedKeyEvent.GetKeyName());
+ DALI_TEST_CHECK(event3.keyString == monitorData.receivedKeyEvent.GetKeyString());
+ DALI_TEST_CHECK(event3.receiveTime == monitorData.receivedKeyEvent.GetReceiveTime());
+ DALI_TEST_CHECK(event3.state == static_cast<Integration::KeyEvent::State>(monitorData.receivedKeyEvent.GetState()));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+
+ data.Reset();
+ monitorData.Reset();
+
+ END_TEST;
+}
+
+int UtcDaliSceneSignalKeyEventMonitorN(void)
+{
+ TestApplication application;
+ Dali::Integration::Scene scene = application.GetScene();
+
+ KeyEventSignalData data;
+ KeyEventReceivedFunctor functor(data);
+ scene.KeyEventMonitorSignal().Connect(&application, functor);
+
+ // Check that a non-pressed key events data is not modified.
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+
+ END_TEST;
+}
+
+
int UtcDaliSceneGetOverlayLayer(void)
{
TestApplication application;
deviceClass(Device::Class::NONE),
deviceSubclass(Device::Subclass::NONE),
isRepeat(false),
- windowId(0)
+ windowId(0),
+ receiveTime(0)
{
}
deviceClass(deviceClass),
deviceSubclass(deviceSubclass),
isRepeat(false),
- windowId(0)
+ windowId(0),
+ receiveTime(0)
{
}
* Window id where key event occurred.
*/
uint32_t windowId;
+
+ /**
+ * The time (in ms) when key event was received.
+ */
+ uint32_t receiveTime;
+
};
} // namespace Integration
return GetImplementation(*this).InterceptKeyEventSignal();
}
+Scene::KeyEventSignalType& Scene::KeyEventMonitorSignal()
+{
+ return GetImplementation(*this).KeyEventMonitorSignal();
+}
+
Scene::TouchEventSignalType& Scene::TouchedSignal()
{
return GetImplementation(*this).TouchedSignal();
*/
KeyEventGeneratedSignalType& InterceptKeyEventSignal();
+ /**
+ * @brief The user would connect to this signal to monitor a KeyEvent at window.
+ * This signal is emitted when KeyEvent is generated.
+ *
+ * A Callback of the following type may be connected:
+ * @code
+ * bool YourCallbackName(const KeyEvent& event);
+ * @endcode
+ *
+ * @return The signal to connect to
+ */
+ KeyEventSignalType& KeyEventMonitorSignal();
+
+
/**
* @brief This signal is emitted when the screen is touched and when the touch ends
* (i.e. the down & up touch events only).
return mWheelEventGeneratedSignal.Emit(event);
}
+void Scene::EmitKeyEventMonitorSignal(const Dali::KeyEvent& event)
+{
+ if(!mKeyEventMonitorSignal.Empty())
+ {
+ Dali::Integration::Scene handle(this);
+ mKeyEventMonitorSignal.Emit(event);
+ }
+}
+
void Scene::AddFrameRenderedCallback(std::unique_ptr<CallbackBase> callback, int32_t frameId)
{
ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal();
return mInterceptKeyEventSignal;
}
+Integration::Scene::KeyEventSignalType& Scene::KeyEventMonitorSignal()
+{
+ return mKeyEventMonitorSignal;
+}
+
Integration::Scene::EventProcessingFinishedSignalType& Scene::EventProcessingFinishedSignal()
{
return mEventProcessingFinishedSignal;
*/
bool EmitWheelEventGeneratedSignal(const Dali::WheelEvent& event);
+ /**
+ * Used by the EventProcessor to emit key event monitor signals.
+ * @param[in] event The key event.
+ */
+ void EmitKeyEventMonitorSignal(const Dali::KeyEvent& event);
+
/**
* @copydoc Dali::Integration::Scene::AddFrameRenderedCallback
*/
*/
Integration::Scene::KeyEventGeneratedSignalType& InterceptKeyEventSignal();
+ /**
+ * @copydoc Integration::Scene::KeyEventSignal()
+ */
+ Integration::Scene::KeyEventSignalType& KeyEventMonitorSignal();
+
/**
* @copydoc Integration::Scene::SignalEventProcessingFinished()
*/
Integration::Scene::KeyEventSignalType mKeyEventSignal;
Integration::Scene::KeyEventGeneratedSignalType mKeyEventGeneratedSignal;
Integration::Scene::KeyEventGeneratedSignalType mInterceptKeyEventSignal;
+ Integration::Scene::KeyEventSignalType mKeyEventMonitorSignal;
// The event processing finished signal
Integration::Scene::EventProcessingFinishedSignalType mEventProcessingFinishedSignal;
// The wheel event signal
Integration::Scene::WheelEventSignalType mWheelEventSignal;
Integration::Scene::WheelEventGeneratedSignalType mWheelEventGeneratedSignal;
+
};
} // namespace Internal
mDeviceClass(Device::Class::NONE),
mDeviceSubclass(Device::Subclass::NONE),
mIsRepeat(false),
- mWindowId(0)
+ mWindowId(0),
+ mReceiveTime(0)
{
}
mDeviceClass(deviceClass),
mDeviceSubclass(deviceSubclass),
mIsRepeat(false),
- mWindowId(0)
+ mWindowId(0),
+ mReceiveTime(0)
{
}
return mWindowId;
}
+uint32_t KeyEvent::GetReceiveTime() const
+{
+ return mReceiveTime;
+}
+
void KeyEvent::SetKeyName(const std::string& keyName)
{
mKeyName = keyName;
mWindowId = windowId;
}
+void KeyEvent::SetReceiveTime(uint32_t time)
+{
+ mReceiveTime = time;
+}
+
} // namespace Internal
} // namespace Dali
*/
uint32_t GetWindowId() const;
+ /**
+ * @copydoc Dali::KeyEvent::GetReceiveTime()
+ */
+ uint32_t GetReceiveTime() const;
+
/**
* @brief Set the name given to the key pressed
*
*/
void SetWindowId(uint32_t windowId);
+ /**
+ * @brief Sets the time when the key event was received.
+ *
+ * @param[in] receiveTime The time when the key event was received.
+ */
+ void SetReceiveTime(uint32_t receiveTime);
private:
/**
Device::Subclass::Type mDeviceSubclass; ///< The subclass of device the key event originated from
bool mIsRepeat; ///< Whether the key referenced by the event is a repeating key.
uint32_t mWindowId; ///< The window id where key event occurred.
+ uint32_t mReceiveTime; ///< The time when the key event was received.
};
} // namespace Internal
{
namespace
{
+const uint32_t DEFAULT_MONITOR_KEY_EVENT_TIME = 330u;
+
DALI_INIT_TRACE_FILTER(gTraceFilter, DALI_TRACE_PERFORMANCE_MARKER, false);
#ifdef TRACE_ENABLED
KeyEventPtr keyEvent(new KeyEvent(event.keyName, event.logicalKey, event.keyString, event.keyCode, event.keyModifier, event.time, static_cast<Dali::KeyEvent::State>(event.state), event.compose, event.deviceName, event.deviceClass, event.deviceSubclass));
keyEvent->SetRepeat(event.isRepeat);
keyEvent->SetWindowId(event.windowId);
+ keyEvent->SetReceiveTime(event.receiveTime);
+
Dali::KeyEvent keyEventHandle(keyEvent.Get());
DALI_TRACE_BEGIN_WITH_MESSAGE_GENERATOR(gTraceFilter, "DALI_PROCESS_KEY_EVENT", [&](std::ostringstream& oss) {
- oss << "[name:" << event.keyName << ", code:" << event.keyCode << ", state:" << KEY_EVENT_STATES[event.state] << ", time:" << event.time << "]";
+ oss << "[name:" << event.keyName << ", code:" << event.keyCode << ", state:" << KEY_EVENT_STATES[event.state] << ", time:" << event.time << ", recieveTime:" << event.receiveTime << "]";
});
+ if(event.receiveTime > 0 && (event.receiveTime >= event.time + DEFAULT_MONITOR_KEY_EVENT_TIME))
+ {
+ DALI_LOG_RELEASE_INFO("KeyEvent is delayed : occurred time %d ms, received time %d ms \n", event.time, event.receiveTime);
+ mScene.EmitKeyEventMonitorSignal(keyEventHandle);
+ }
+
// Emit the key event signal from the scene.
bool consumed = false;
if(!keyEventHandle.IsNoInterceptModifier())
return GetImplementation(*this).GetWindowId();
}
+uint32_t KeyEvent::GetReceiveTime() const
+{
+ return GetImplementation(*this).GetReceiveTime();
+}
+
KeyEvent::KeyEvent(Internal::KeyEvent* internal)
: BaseHandle(internal)
{
*/
uint32_t GetWindowId() const;
+ /**
+ * @brief Gets the time when the key event was received.
+ * @SINCE_2_3.52
+ */
+ uint32_t GetReceiveTime() const;
+
public: // Not intended for application developers
/// @cond internal
/**