Platform was sending ascii code instead of utf8 code.
Used cached value for utf8 code passed by platform in
ime preedit and commit callbacks.
Bug: http://168.219.209.56/jira/browse/TNEF-235
Reviewed by: Jaesik Chang, Marcin Kolibabka, Marcin Krakowiak
Change-Id: I812c4fefefe7e45ab5b762940e751ee8eec5fbc7
Signed-off-by: Piotr Grad <p.grad@samsung.com>
Signed-off-by: Tomasz Weglarski <t.weglarski@samsung.com>
ecore_imf_context_del(context_);
}
-void IMContextEfl::HandleKeyDownEvent(const Evas_Event_Key_Down* event, bool* wasFiltered) {
+void IMContextEfl::HandleKeyDownEvent(const Evas_Event_Key_Down* event,
+ bool* wasFiltered, std::string* utf8_key) {
#if USE_IM_COMPOSITING
Ecore_IMF_Event im_event;
is_handling_keydown_ = true;
+ utf8_key_ = event->keyname;
ecore_imf_evas_event_key_down_wrap(const_cast<Evas_Event_Key_Down*>(event), &im_event.key_down);
*wasFiltered = ecore_imf_context_filter_event(context_, ECORE_IMF_EVENT_KEY_DOWN, &im_event);
+ // In November 2003, UTF-8 was restricted by RFC 3629 to end at U+10FFFF,
+ // in order to match the constraints of the UTF-16 character encoding.
+ // This removed all 5- and 6-byte sequences, and about half of the 4-byte
+ // sequences. So that we are copying 4 bytes to get first char data.
+ *utf8_key = utf8_key_.substr(0, 4);
is_handling_keydown_ = false;
#endif
}
char* text = static_cast<char*>(event_info);
+ utf8_key_ = text;
base::string16 text16 = base::UTF8ToUTF16(text);
// Only add commit to queue, till we dont know if key event
// should be handled. It can be default prevented for exactly.
if (!buffer)
return;
+ utf8_key_ = buffer;
// Add empty commit to stop processing commits.
commit_queue_.push(base::string16());
~IMContextEfl();
- void HandleKeyDownEvent(const Evas_Event_Key_Down* event, bool* wasFiltered);
+ void HandleKeyDownEvent(const Evas_Event_Key_Down* event, bool* wasFiltered,
+ std::string* utf8_key);
void HandleKeyUpEvent(const Evas_Event_Key_Up* event, bool* wasFiltered);
void UpdateInputMethodType(ui::TextInputType, ui::TextInputMode,
bool is_handling_keydown_;
bool is_ime_ctx_reset_;
+ std::string utf8_key_;
};
} // namespace content
controller->SetCaretSelectionStatus(false);
controller->HideHandleAndContextMenu();
}
- if (im_context_ && im_context_->IsShow() &&
- ClipboardHelperEfl::GetInstance()->IsClipboardWindowOpened()) {
- ClipboardHelperEfl::GetInstance()->CloseClipboardWindow();
+ if (im_context_) {
+ if (im_context_->IsShow() &&
+ ClipboardHelperEfl::GetInstance()->IsClipboardWindowOpened()) {
+ ClipboardHelperEfl::GetInstance()->CloseClipboardWindow();
+ }
+ im_context_->ResetIMFContext();
+ im_context_->ClearQueues();
}
}
}
}
void RenderWidgetHostViewEfl::HandleEvasEvent(const Evas_Event_Key_Down* event) {
- bool wasFiltered = false;
-
if (WebEventFactoryEfl::isHardwareBackKey(event) && disambiguation_popup_) {
disambiguation_popup_->Dismiss();
}
if (!strcmp(event->key, "Return")) {
im_context_->CancelComposition();
}
- im_context_->HandleKeyDownEvent(event, &wasFiltered);
- NativeWebKeyboardEvent n_event = WebEventFactoryEfl::toWebKeyboardEvent(evas_, event);
+
+ bool wasFiltered = false;
+ std::string utf8_key = event->string ? event->string : "";
+ im_context_->HandleKeyDownEvent(event, &wasFiltered, &utf8_key);
+
+ NativeWebKeyboardEvent n_event = WebEventFactoryEfl::toWebKeyboardEvent(
+ evas_, event, event->string ? utf8_key.c_str() : 0);
// When upper case letter is entered there are two events
// Shift + letter key
// Do not forward keyevent now if there is fake key event
// handling at the moment to preserve orders of events as in Webkit
- if (im_context_->GetPreeditQueue().empty() ||
- keyupev_queue_.empty()) {
+ if (im_context_->GetPreeditQueue().empty() || keyupev_queue_.empty()) {
host_->ForwardKeyboardEvent(n_event);
} else {
NativeWebKeyboardEvent *n_event_ptr = new NativeWebKeyboardEvent();
n_event_ptr->timeStampSeconds = n_event.timeStampSeconds;
- n_event_ptr->modifiers = n_event.modifiers;
n_event_ptr->type = n_event.type;
- n_event_ptr->nativeKeyCode = n_event.nativeKeyCode;
+ n_event_ptr->modifiers = n_event.modifiers;
n_event_ptr->windowsKeyCode = n_event.windowsKeyCode;
+ n_event_ptr->nativeKeyCode = n_event.nativeKeyCode;
n_event_ptr->isSystemKey = n_event.isSystemKey;
- n_event_ptr->unmodifiedText[0] = n_event.unmodifiedText[0];
- n_event_ptr->text[0] = n_event.text[0];
+ memcpy(n_event_ptr->text, n_event.text,
+ sizeof(n_event_ptr->text));
+ memcpy(n_event_ptr->unmodifiedText, n_event.unmodifiedText,
+ sizeof(n_event_ptr->unmodifiedText));
+ memcpy(n_event_ptr->keyIdentifier, n_event.keyIdentifier,
+ sizeof(n_event_ptr->keyIdentifier));
keydownev_queue_.push(n_event_ptr);
}
keyupev_queue_.push(n_event.windowsKeyCode);
- } else
+ } else {
host_->ForwardKeyboardEvent(WebEventFactoryEfl::toWebKeyboardEvent(evas_, event));
+ }
}
void RenderWidgetHostViewEfl::HandleEvasEvent(const Evas_Event_Key_Up* event) {
- bool wasFiltered = false;
- if (im_context_)
+ if (im_context_) {
+ bool wasFiltered = false;
im_context_->HandleKeyUpEvent(event, &wasFiltered);
-
- if (!im_context_)
+ } else {
host_->ForwardKeyboardEvent(WebEventFactoryEfl::toWebKeyboardEvent(evas_, event));
+ }
}
#if defined(OS_TIZEN)
return;
if (!im_context_->GetPreeditQueue().empty()) {
- if (!processed)
+ if (!processed) {
SetComposition(im_context_->GetPreeditQueue().front());
-
+ } else {
+ im_context_->ResetIMFContext();
+ }
im_context_->PreeditQueuePop();
}
}
return XKeysymToKeycode((Display*)ecore_x_display_get(), XStringToKeysym(key));
}
-static int CharacterFromEflString(const char* string) {
- if (string) {
- base::string16 result;
- base::UTF8ToUTF16(string, strlen(string), &result);
- return result.length() == 1 ? result[0] : 0;
- }
-
- return 0;
-}
-
// From
// third_party/blink/Source/blink/chromium/src/gtk/WebInputEventFactory.cpp:
static blink::WebUChar GetControlCharacter(int windows_key_code, bool shift) {
return webKitEvent;
}
-static content::NativeWebKeyboardEvent WebKeyEvent(unsigned int timestamp, const Evas_Modifier* modifiers, const char* key,
- const char* string, bool pressed) {
+static content::NativeWebKeyboardEvent WebKeyEvent(
+ unsigned int timestamp, const Evas_Modifier* modifiers, const char* key,
+ const char* string, bool pressed) {
content::NativeWebKeyboardEvent webKitEvent;
webKitEvent.timeStampSeconds = (double)timestamp / 1000;
webKitEvent.modifiers = EvasToWebModifiers(modifiers);
webKitEvent.nativeKeyCode = NativeKeyCodeFromEflKey(key);
webKitEvent.windowsKeyCode = WindowsKeyCodeFromEflKey(key);
- if (webKitEvent.windowsKeyCode == ui::VKEY_RETURN)
- webKitEvent.unmodifiedText[0] = '\r';
- else
- webKitEvent.unmodifiedText[0] = CharacterFromEflString(string);
+ if (webKitEvent.windowsKeyCode == ui::VKEY_RETURN) {
+ memset(webKitEvent.unmodifiedText, 0,
+ sizeof(webKitEvent.unmodifiedText));
+ webKitEvent.unmodifiedText[0] = '\r';
+ } else {
+ if (string) {
+ base::string16 utf16str = base::UTF8ToUTF16(string);
+ size_t size = base::c16len(utf16str.data());
+ base::c16memcpy(webKitEvent.unmodifiedText, utf16str.data(),
+ std::min(size, NativeWebKeyboardEvent::textLengthCap));
+ if (size > NativeWebKeyboardEvent::textLengthCap) {
+ LOG(WARNING) << "Truncated value was copied into unmodifiedText field.";
+ }
+ } else {
+ memset(webKitEvent.unmodifiedText, 0,
+ sizeof(webKitEvent.unmodifiedText));
+ }
+ }
if (webKitEvent.modifiers & blink::WebInputEvent::ControlKey) {
webKitEvent.text[0] =
webKitEvent.windowsKeyCode,
webKitEvent.modifiers & blink::WebInputEvent::ShiftKey);
} else {
- webKitEvent.text[0] = webKitEvent.unmodifiedText[0];
+ memcpy(webKitEvent.text, webKitEvent.unmodifiedText,
+ sizeof(webKitEvent.text));
}
webKitEvent.setKeyIdentifierFromWindowsKeyCode();
return webKitEvent;
}
-content::NativeWebKeyboardEvent WebEventFactoryEfl::toWebKeyboardEvent(Evas*, const Evas_Event_Key_Down* ev) {
- return WebKeyEvent(ev->timestamp, ev->modifiers, ev->key, ev->string, true);
+content::NativeWebKeyboardEvent WebEventFactoryEfl::toWebKeyboardEvent(Evas*,
+ const Evas_Event_Key_Down* ev, const char* utf8) {
+ return WebKeyEvent(ev->timestamp,
+ ev->modifiers, ev->key, utf8 ? utf8 : ev->string, true);
}
-content::NativeWebKeyboardEvent WebEventFactoryEfl::toWebKeyboardEvent(Evas*, const Evas_Event_Key_Up* ev) {
+content::NativeWebKeyboardEvent WebEventFactoryEfl::toWebKeyboardEvent(Evas*,
+ const Evas_Event_Key_Up* ev) {
return WebKeyEvent(ev->timestamp, ev->modifiers, ev->key, ev->string, false);
}
static ui::EventType EvasTouchEventTypeToUI(Evas_Touch_Point_State evas_touch) {
- switch(evas_touch) {
+ switch (evas_touch) {
case EVAS_TOUCH_POINT_DOWN:
return ui::ET_TOUCH_PRESSED;
case EVAS_TOUCH_POINT_MOVE:
class WebEventFactoryEfl {
public:
- static blink::WebMouseEvent toWebMouseEvent(Evas*, Evas_Object*, const Evas_Event_Mouse_Down*, float scale_factor);
- static blink::WebMouseEvent toWebMouseEvent(Evas*, Evas_Object*, const Evas_Event_Mouse_Up*, float scale_factor);
- static blink::WebMouseEvent toWebMouseEvent(Evas*, Evas_Object*, const Evas_Event_Mouse_Move*, float scale_factor);
- static blink::WebMouseWheelEvent toWebMouseEvent(Evas*, Evas_Object*, const Evas_Event_Mouse_Wheel*, float scale_factor);
- static content::NativeWebKeyboardEvent toWebKeyboardEvent(Evas*, const Evas_Event_Key_Down*);
- static content::NativeWebKeyboardEvent toWebKeyboardEvent(Evas*, const Evas_Event_Key_Up*);
-
- static ui::TouchEvent toUITouchEvent(const tizen_webview::Touch_Point*, Evas_Object* evas_object, float scale_factor);
+ static blink::WebMouseEvent toWebMouseEvent(Evas*, Evas_Object*,
+ const Evas_Event_Mouse_Down*, float scale_factor);
+ static blink::WebMouseEvent toWebMouseEvent(Evas*, Evas_Object*,
+ const Evas_Event_Mouse_Up*, float scale_factor);
+ static blink::WebMouseEvent toWebMouseEvent(Evas*, Evas_Object*,
+ const Evas_Event_Mouse_Move*, float scale_factor);
+ static blink::WebMouseWheelEvent toWebMouseEvent(Evas*, Evas_Object*,
+ const Evas_Event_Mouse_Wheel*, float scale_factor);
+ static content::NativeWebKeyboardEvent toWebKeyboardEvent(Evas*,
+ const Evas_Event_Key_Down*, const char* utf8 = NULL);
+ static content::NativeWebKeyboardEvent toWebKeyboardEvent(Evas*,
+ const Evas_Event_Key_Up*);
+
+ static ui::TouchEvent toUITouchEvent(const tizen_webview::Touch_Point*,
+ Evas_Object* evas_object, float scale_factor);
static bool isHardwareBackKey(const Evas_Event_Key_Down* event);
};