#elif PLATFORM(EFL)
#include <Evas.h>
#include <Ecore_IMF.h>
-#if ENABLE(TIZEN_ISF_PORT)
-typedef struct {
- Ecore_IMF_Event_Type type;
- Ecore_IMF_Event event;
-} EvasImfEvent;
-#endif
#endif
namespace WebKit {
+#if ENABLE(TIZEN_ISF_PORT)
+class EcoreIMFEvent : public RefCounted<EcoreIMFEvent> {
+public:
+ EcoreIMFEvent(const Evas_Event_Key_Down*);
+ EcoreIMFEvent(const Evas_Event_Key_Up*);
+ ~EcoreIMFEvent();
+
+ Ecore_IMF_Event_Type type() const { return m_type; }
+ const Ecore_IMF_Event* event() const { return &m_event; }
+
+private:
+ Ecore_IMF_Event_Type m_type;
+ Ecore_IMF_Event m_event;
+};
+#endif
+
class NativeWebKeyboardEvent : public WebKeyboardEvent {
public:
#if USE(APPKIT)
NativeWebKeyboardEvent(const NativeWebKeyboardEvent&);
NativeWebKeyboardEvent(GdkEvent*);
#elif PLATFORM(EFL)
+ NativeWebKeyboardEvent(const Evas_Event_Key_Down*, bool);
+ NativeWebKeyboardEvent(const Evas_Event_Key_Up*);
#if ENABLE(TIZEN_ISF_PORT)
NativeWebKeyboardEvent();
#endif
- NativeWebKeyboardEvent(const Evas_Event_Key_Down*, bool);
- NativeWebKeyboardEvent(const Evas_Event_Key_Up*);
#endif
#if USE(APPKIT)
GdkEvent* nativeEvent() const { return m_nativeEvent.get(); }
#elif PLATFORM(EFL)
#if ENABLE(TIZEN_ISF_PORT)
- const EvasImfEvent* nativeEvent() const { return &m_nativeEvent; }
- bool isFiltered() const { return m_filtered; }
+ const EcoreIMFEvent* nativeEvent() const { return m_nativeEvent.get(); }
+ bool isFiltered() const { return m_isFiltered; }
+
+ void setInputMethodContextID(uintptr_t id) { m_inputMethodContextID = id; }
+ uintptr_t inputMethodContextID() const { return m_inputMethodContextID; }
void encode(CoreIPC::ArgumentEncoder*) const;
static bool decode(CoreIPC::ArgumentDecoder*, NativeWebKeyboardEvent&);
GOwnPtr<GdkEvent> m_nativeEvent;
#elif PLATFORM(EFL)
#if ENABLE(TIZEN_ISF_PORT)
- EvasImfEvent m_nativeEvent;
- bool m_filtered;
+ RefPtr<EcoreIMFEvent> m_nativeEvent;
+ bool m_isFiltered;
+ uintptr_t m_inputMethodContextID;
#else
const void* m_nativeEvent;
bool m_isFiltered;
namespace WebKit {
-NativeWebKeyboardEvent::NativeWebKeyboardEvent(const Evas_Event_Key_Down* event, bool filtered)
+EcoreIMFEvent::EcoreIMFEvent(const Evas_Event_Key_Down* event)
+ : m_type(ECORE_IMF_EVENT_KEY_DOWN)
+{
+ Ecore_IMF_Event_Key_Down* keyDownEvent = &m_event.key_down;
+
+ ecore_imf_evas_event_key_down_wrap(const_cast<Evas_Event_Key_Down*>(event), keyDownEvent);
+
+ if (keyDownEvent->keyname)
+ keyDownEvent->keyname = strdup(keyDownEvent->keyname);
+ if (keyDownEvent->key)
+ keyDownEvent->key = strdup(keyDownEvent->key);
+ if (keyDownEvent->string)
+ keyDownEvent->string = strdup(keyDownEvent->string);
+ if (keyDownEvent->compose)
+ keyDownEvent->compose = strdup(keyDownEvent->compose);
+}
+
+EcoreIMFEvent::EcoreIMFEvent(const Evas_Event_Key_Up* event)
+ : m_type(ECORE_IMF_EVENT_KEY_UP)
+{
+ Ecore_IMF_Event_Key_Up* keyUpEvent = &m_event.key_up;
+
+ ecore_imf_evas_event_key_up_wrap(const_cast<Evas_Event_Key_Up*>(event), keyUpEvent);
+
+ if (keyUpEvent->keyname)
+ keyUpEvent->keyname = strdup(keyUpEvent->keyname);
+ if (keyUpEvent->key)
+ keyUpEvent->key = strdup(keyUpEvent->key);
+ if (keyUpEvent->string)
+ keyUpEvent->string = strdup(keyUpEvent->string);
+ if (keyUpEvent->compose)
+ keyUpEvent->compose = strdup(keyUpEvent->compose);
+}
+
+EcoreIMFEvent::~EcoreIMFEvent()
+{
+ if (m_type == ECORE_IMF_EVENT_KEY_DOWN) {
+ Ecore_IMF_Event_Key_Down* keyDownEvent = &m_event.key_down;
+ if (keyDownEvent->keyname)
+ free(const_cast<char*>(keyDownEvent->keyname));
+ if (keyDownEvent->key)
+ free(const_cast<char*>(keyDownEvent->key));
+ if (keyDownEvent->string)
+ free(const_cast<char*>(keyDownEvent->string));
+ if (keyDownEvent->compose)
+ free(const_cast<char*>(keyDownEvent->compose));
+ } else if (m_type == ECORE_IMF_EVENT_KEY_UP) {
+ Ecore_IMF_Event_Key_Up* keyUpEvent = &m_event.key_up;
+ if (keyUpEvent->keyname)
+ free(const_cast<char*>(keyUpEvent->keyname));
+ if (keyUpEvent->key)
+ free(const_cast<char*>(keyUpEvent->key));
+ if (keyUpEvent->string)
+ free(const_cast<char*>(keyUpEvent->string));
+ if (keyUpEvent->compose)
+ free(const_cast<char*>(keyUpEvent->compose));
+ }
+}
+
+NativeWebKeyboardEvent::NativeWebKeyboardEvent(const Evas_Event_Key_Down* event, bool isFiltered)
: WebKeyboardEvent(WebEventFactory::createWebKeyboardEvent(event))
- , m_filtered(filtered)
+ , m_nativeEvent(adoptRef(new EcoreIMFEvent(event)))
+ , m_isFiltered(isFiltered)
+ , m_inputMethodContextID(0)
{
- m_nativeEvent.type = ECORE_IMF_EVENT_KEY_DOWN;
- ecore_imf_evas_event_key_down_wrap(const_cast<Evas_Event_Key_Down*>(event), &m_nativeEvent.event.key_down);
}
NativeWebKeyboardEvent::NativeWebKeyboardEvent(const Evas_Event_Key_Up* event)
: WebKeyboardEvent(WebEventFactory::createWebKeyboardEvent(event))
- , m_filtered(false)
+ , m_nativeEvent(adoptRef(new EcoreIMFEvent(event)))
+ , m_isFiltered(false)
+ , m_inputMethodContextID(0)
{
- m_nativeEvent.type = ECORE_IMF_EVENT_KEY_UP;
- ecore_imf_evas_event_key_up_wrap(const_cast<Evas_Event_Key_Up*>(event), &m_nativeEvent.event.key_up);
}
NativeWebKeyboardEvent::NativeWebKeyboardEvent()
- : m_filtered(false)
+ : m_isFiltered(false)
+ , m_inputMethodContextID(0)
{
}
void NativeWebKeyboardEvent::encode(CoreIPC::ArgumentEncoder* encoder) const
{
WebKeyboardEvent::encode(encoder);
- encoder->encode(m_filtered);
+ encoder->encode(m_isFiltered);
+ encoder->encode(m_inputMethodContextID);
}
bool NativeWebKeyboardEvent::decode(CoreIPC::ArgumentDecoder* decoder, NativeWebKeyboardEvent& result)
if (!WebKeyboardEvent::decode(decoder, result))
return false;
- if (!decoder->decode(result.m_filtered))
+ if (!decoder->decode(result.m_isFiltered))
+ return false;
+
+ if (!decoder->decode(result.m_inputMethodContextID))
return false;
return true;
if (inputMethodContext)
inputMethodContext->handleKeyDownEvent(downEvent, &isFiltered);
+#if ENABLE(TIZEN_ISF_PORT)
+ NativeWebKeyboardEvent nativeEvent(downEvent, isFiltered);
+ nativeEvent.setInputMethodContextID(impl->pageProxy->editorState().inputMethodContextID);
+ impl->pageProxy->handleKeyboardEvent(nativeEvent);
+#else
impl->pageProxy->handleKeyboardEvent(NativeWebKeyboardEvent(downEvent, isFiltered));
+#endif
+
return true;
}
void didCancelComposition();
void removeInputMethodContext(uintptr_t);
+ void recalcFilterEvent(const EditorState&, bool, bool&);
#endif
void setBackgroundColor(double red, double green, double blue, double alpha);
#if ENABLE(TIZEN_WEBKIT2_FORM_DATABASE)
TextChangeInTextField(WTF::String name, WTF::String value)
#endif
-#if ENABLE(TIZEN_ISF_PORT)
- DidCancelComposition()
-#endif
#if ENABLE(TIZEN_OFFLINE_PAGE_SAVE)
SaveSerializedHTMLDataForMainPage(WTF::String name, WTF::String value);
SaveSubresourcesData(Vector<WebKit::WebSubresourceTizen> subresources);
#endif
#if ENABLE(TIZEN_ISF_PORT)
+ DidCancelComposition()
RemoveInputMethodContext(uintptr_t id)
+ RecalcFilterEvent(WebKit::EditorState editorState, bool isStart) -> (bool isFiltered)
#endif
#if ENABLE(TIZEN_WEBKIT2_NOTIFY_SUSPEND_BY_REMOTE_WEB_INSPECTOR)
m_approximateCursorPosition = removePosition;
}
}
+
+bool InputMethodContextEfl::recalcFilterEvent(const Ecore_IMF_Event* event)
+{
+ if (!m_context)
+ return false;
+
+ m_doNotHandleFakeKeyEvent = true;
+ bool isFiltered = ecore_imf_context_filter_event(m_context.get(), ECORE_IMF_EVENT_KEY_DOWN, const_cast<Ecore_IMF_Event*>(event));
+ m_doNotHandleFakeKeyEvent = false;
+
+ return isFiltered;
+}
#endif // #if ENABLE(TIZEN_ISF_PORT)
}
bool isIMEPostion(int, int);
void removeIMFContext(uintptr_t);
int state() { return m_state; }
+ bool recalcFilterEvent(const Ecore_IMF_Event*);
#endif
private:
inputMethodContext->removeIMFContext(id);
}
+
+void WebPageProxy::recalcFilterEvent(const EditorState& editorState, bool isStart, bool& isFiltered)
+{
+ if (isStart)
+ process()->send(Messages::WebPage::EndRecalcFilterEvent(), m_pageID);
+
+ editorStateChanged(editorState);
+ isFiltered = false;
+
+ InputMethodContextEfl* inputMethodContext = static_cast<PageClientImpl*>(m_pageClient)->viewImpl()->inputMethodContext();
+ if (!inputMethodContext || m_keyEventQueue.isEmpty())
+ return;
+
+#if ENABLE(TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP)
+ NativeWebKeyboardEvent event = m_keyEventQueue.first().forwardedEvent;
+#else
+ NativeWebKeyboardEvent event = m_keyEventQueue.first();
+#endif
+ if (!event.nativeEvent() || event.nativeEvent()->type() != ECORE_IMF_EVENT_KEY_DOWN)
+ return;
+
+ isFiltered = inputMethodContext->recalcFilterEvent(event.nativeEvent()->event());
+}
#endif // #if ENABLE(TIZEN_ISF_PORT)
void WebPageProxy::requestUpdateFormNavigation()
return isFiltered;
Vector<OwnPtr<KeyPressCommand> > commands;
+ bool recalcFilterEvent = page->recalcFilterEvent();
+ const EditorState& editorState = page->currentEditorState();
+
+ if (recalcFilterEvent || currentEvent->inputMethodContextID() != editorState.inputMethodContextID) {
+ if (!recalcFilterEvent)
+ page->startRecalcFilterEvent();
+ page->sendSync(Messages::WebPageProxy::RecalcFilterEvent(editorState, !recalcFilterEvent), Messages::WebPageProxy::RecalcFilterEvent::Reply(isFiltered));
+ return isFiltered;
+ }
+
page->swapKeyPressCommands(commands);
size_t size = commands.size();
, m_inspectorClient(0)
#if ENABLE(TIZEN_ISF_PORT)
, m_prepareKeyDownEvent(false)
+ , m_recalcFilterEvent(false)
#endif
{
ASSERT(m_pageID);
void swapKeyPressCommands(Vector<OwnPtr<KeyPressCommand> >&);
void deleteSurroundingText(int, int);
+
+ bool recalcFilterEvent() const { return m_recalcFilterEvent; }
+ void startRecalcFilterEvent() { m_recalcFilterEvent = true; }
+ void endRecalcFilterEvent() { m_recalcFilterEvent = false; }
#endif
void scrollMainFrameBy(const WebCore::IntSize&);
void scrollMainFrameTo(const WebCore::IntPoint&);
#if ENABLE(TIZEN_ISF_PORT)
bool m_prepareKeyDownEvent;
Vector<OwnPtr<KeyPressCommand> > m_keyPressCommands;
+ bool m_recalcFilterEvent;
#endif
};
#if ENABLE(TIZEN_ISF_PORT)
PrepareKeyDownEvent()
DeleteSurroundingText(int offset, int count)
+ EndRecalcFilterEvent()
#endif
#endif
#if PLATFORM(EFL)