Skip to content

Commit 7e058f9

Browse files
authored
Fix a text input bug on TV (#124)
* Fix a text input bug on TV * Check the device where the key event occurred Signed-off-by: Boram Bae <[email protected]> * Apply naming conventions Signed-off-by: Boram Bae <[email protected]>
1 parent 399c885 commit 7e058f9

File tree

2 files changed

+43
-57
lines changed

2 files changed

+43
-57
lines changed

shell/platform/tizen/channels/text_input_channel.cc

+41-55
Original file line numberDiff line numberDiff line change
@@ -404,72 +404,61 @@ void TextInputChannel::SendStateUpdate(const TextInputModel& model) {
404404
channel_->InvokeMethod(kUpdateEditingStateMethod, std::move(args));
405405
}
406406

407-
bool TextInputChannel::FilterEvent(Ecore_Event_Key* keyDownEvent) {
407+
bool TextInputChannel::FilterEvent(Ecore_Event_Key* event) {
408408
bool handled = false;
409409

410-
#ifdef TIZEN_RENDERER_EVAS_GL
411-
// Hardware keyboard not supported when running in Evas GL mode.
412-
bool isIME = true;
410+
#ifdef WEARABLE_PROFILE
411+
// Hardware keyboard not supported on watches.
412+
bool is_ime = true;
413413
#else
414-
bool isIME = ecore_imf_context_keyboard_mode_get(imf_context_) ==
415-
ECORE_IMF_INPUT_PANEL_SW_KEYBOARD_MODE;
414+
bool is_ime = strcmp(ecore_device_name_get(event->dev), "ime") == 0;
416415
#endif
417416

418-
Ecore_IMF_Event_Key_Down ecoreKeyDownEvent;
419-
ecoreKeyDownEvent.keyname = keyDownEvent->keyname;
420-
ecoreKeyDownEvent.key = keyDownEvent->key;
421-
ecoreKeyDownEvent.string = keyDownEvent->string;
422-
ecoreKeyDownEvent.compose = keyDownEvent->compose;
423-
ecoreKeyDownEvent.timestamp = keyDownEvent->timestamp;
424-
ecoreKeyDownEvent.modifiers =
425-
EcoreInputModifierToEcoreIMFModifier(keyDownEvent->modifiers);
426-
ecoreKeyDownEvent.locks =
427-
EcoreInputModifierToEcoreIMFLock(keyDownEvent->modifiers);
428-
ecoreKeyDownEvent.dev_name = isIME ? "ime" : "";
429-
ecoreKeyDownEvent.keycode = keyDownEvent->keycode;
430-
431-
if (isIME && strcmp(keyDownEvent->key, "Select") == 0) {
417+
Ecore_IMF_Event_Key_Down imf_event;
418+
imf_event.keyname = event->keyname;
419+
imf_event.key = event->key;
420+
imf_event.string = event->string;
421+
imf_event.compose = event->compose;
422+
imf_event.timestamp = event->timestamp;
423+
imf_event.modifiers = EcoreInputModifierToEcoreIMFModifier(event->modifiers);
424+
imf_event.locks = EcoreInputModifierToEcoreIMFLock(event->modifiers);
425+
imf_event.dev_name = is_ime ? "ime" : "";
426+
imf_event.keycode = event->keycode;
427+
428+
if (is_ime && strcmp(event->key, "Select") == 0) {
432429
if (engine_->device_profile == DeviceProfile::kWearable) {
433430
// FIXME: for wearable
434431
in_select_mode_ = true;
435432
FT_LOGI("Set select mode[true]");
436433
}
437434
}
438435

439-
if (isIME) {
440-
if (!strcmp(keyDownEvent->key, "Left") ||
441-
!strcmp(keyDownEvent->key, "Right") ||
442-
!strcmp(keyDownEvent->key, "Up") ||
443-
!strcmp(keyDownEvent->key, "Down") ||
444-
!strcmp(keyDownEvent->key, "End") ||
445-
!strcmp(keyDownEvent->key, "Home") ||
446-
!strcmp(keyDownEvent->key, "BackSpace") ||
447-
!strcmp(keyDownEvent->key, "Delete") ||
448-
(!strcmp(keyDownEvent->key, "Select") && !in_select_mode_)) {
436+
if (is_ime) {
437+
if (!strcmp(event->key, "Left") || !strcmp(event->key, "Right") ||
438+
!strcmp(event->key, "Up") || !strcmp(event->key, "Down") ||
439+
!strcmp(event->key, "End") || !strcmp(event->key, "Home") ||
440+
!strcmp(event->key, "BackSpace") || !strcmp(event->key, "Delete") ||
441+
(!strcmp(event->key, "Select") && !in_select_mode_)) {
449442
// Force redirect to fallback!(especially on TV)
450443
// If you don't do this, it affects the input panel.
451444
// For example, when the left key of the input panel is pressed, the focus
452445
// of the input panel is shifted to left!
453446
// What we want is to move only the cursor on the text editor.
454447
ResetCurrentContext();
455-
FT_LOGW("Force redirect IME key-event[%s] to fallback",
456-
keyDownEvent->keyname);
448+
FT_LOGW("Force redirect IME key-event[%s] to fallback", event->keyname);
457449
return false;
458450
}
459451
}
460452

461453
handled = ecore_imf_context_filter_event(
462454
imf_context_, ECORE_IMF_EVENT_KEY_DOWN,
463-
reinterpret_cast<Ecore_IMF_Event*>(&ecoreKeyDownEvent));
455+
reinterpret_cast<Ecore_IMF_Event*>(&imf_event));
464456

465457
if (handled) {
466-
last_handled_ecore_event_keyname_ = keyDownEvent->keyname;
458+
last_handled_ecore_event_keyname_ = event->keyname;
467459
}
468460

469-
FT_LOGI("The %skey-event[%s] are%s filtered", isIME ? "IME " : "",
470-
keyDownEvent->keyname, handled ? "" : " not");
471-
472-
if (!handled && !strcmp(keyDownEvent->key, "Return") && in_select_mode_ &&
461+
if (!handled && !strcmp(event->key, "Return") && in_select_mode_ &&
473462
engine_->device_profile == DeviceProfile::kWearable) {
474463
in_select_mode_ = false;
475464
handled = true;
@@ -479,61 +468,58 @@ bool TextInputChannel::FilterEvent(Ecore_Event_Key* keyDownEvent) {
479468
return handled;
480469
}
481470

482-
void TextInputChannel::NonIMFFallback(Ecore_Event_Key* keyDownEvent) {
483-
FT_LOGI("NonIMFFallback key name [%s]", keyDownEvent->keyname);
484-
471+
void TextInputChannel::NonIMFFallback(Ecore_Event_Key* event) {
485472
// For mobile, fix me!
486473
if (engine_->device_profile == DeviceProfile::kMobile &&
487474
edit_status_ == EditStatus::kPreeditEnd) {
488475
SetEditStatus(EditStatus::kNone);
489-
FT_LOGW("Ignore key-event[%s]!", keyDownEvent->keyname);
476+
FT_LOGW("Ignore key-event[%s]!", event->keyname);
490477
return;
491478
}
492479

493-
bool select = !strcmp(keyDownEvent->key, "Select");
480+
bool select = !strcmp(event->key, "Select");
494481
bool is_filtered = true;
495-
if (!strcmp(keyDownEvent->key, "Left")) {
482+
if (!strcmp(event->key, "Left")) {
496483
if (active_model_ && active_model_->MoveCursorBack()) {
497484
SendStateUpdate(*active_model_);
498485
}
499-
} else if (!strcmp(keyDownEvent->key, "Right")) {
486+
} else if (!strcmp(event->key, "Right")) {
500487
if (active_model_ && active_model_->MoveCursorForward()) {
501488
SendStateUpdate(*active_model_);
502489
}
503-
} else if (!strcmp(keyDownEvent->key, "End")) {
490+
} else if (!strcmp(event->key, "End")) {
504491
if (active_model_) {
505492
active_model_->MoveCursorToEnd();
506493
SendStateUpdate(*active_model_);
507494
}
508-
} else if (!strcmp(keyDownEvent->key, "Home")) {
495+
} else if (!strcmp(event->key, "Home")) {
509496
if (active_model_) {
510497
active_model_->MoveCursorToBeginning();
511498
SendStateUpdate(*active_model_);
512499
}
513-
} else if (!strcmp(keyDownEvent->key, "BackSpace")) {
500+
} else if (!strcmp(event->key, "BackSpace")) {
514501
if (active_model_ && active_model_->Backspace()) {
515502
SendStateUpdate(*active_model_);
516503
}
517-
} else if (!strcmp(keyDownEvent->key, "Delete")) {
504+
} else if (!strcmp(event->key, "Delete")) {
518505
if (active_model_ && active_model_->Delete()) {
519506
SendStateUpdate(*active_model_);
520507
}
521-
} else if (!strcmp(keyDownEvent->key, "Return") ||
522-
(select && !in_select_mode_)) {
508+
} else if (!strcmp(event->key, "Return") || (select && !in_select_mode_)) {
523509
if (active_model_) {
524510
EnterPressed(active_model_.get(), select);
525511
}
526-
} else if (keyDownEvent->string && strlen(keyDownEvent->string) == 1 &&
527-
IsASCIIPrintableKey(keyDownEvent->string[0])) {
512+
} else if (event->string && strlen(event->string) == 1 &&
513+
IsASCIIPrintableKey(event->string[0])) {
528514
if (active_model_) {
529-
active_model_->AddCodePoint(keyDownEvent->string[0]);
515+
active_model_->AddCodePoint(event->string[0]);
530516
SendStateUpdate(*active_model_);
531517
}
532518
} else {
533519
is_filtered = false;
534520
}
535521
if (!active_model_ && is_filtered) {
536-
engine_->platform_view_channel->SendKeyEvent(keyDownEvent, true);
522+
engine_->platform_view_channel->SendKeyEvent(event, true);
537523
}
538524
SetEditStatus(EditStatus::kNone);
539525
}

shell/platform/tizen/channels/text_input_channel.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ class TextInputChannel {
5858
const MethodCall<rapidjson::Document>& method_call,
5959
std::unique_ptr<MethodResult<rapidjson::Document>> result);
6060
void SendStateUpdate(const TextInputModel& model);
61-
bool FilterEvent(Ecore_Event_Key* keyDownEvent);
62-
void NonIMFFallback(Ecore_Event_Key* keyDownEvent);
61+
bool FilterEvent(Ecore_Event_Key* event);
62+
void NonIMFFallback(Ecore_Event_Key* event);
6363
void EnterPressed(TextInputModel* model, bool select);
6464
void RegisterIMFCallback();
6565
void UnregisterIMFCallback();

0 commit comments

Comments
 (0)