blob: 5d41bcdfedb92225957f2afa1e2db6cbfe8aae87 [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "services/keyboard/linux/keyboard_service_impl.h"
#include "base/logging.h"
#include "base/strings/string16.h"
#include "base/strings/utf_string_conversions.h"
#include "mojo/public/cpp/application/connect.h"
#include "mojo/services/input_events/interfaces/input_key_codes.mojom.h"
namespace keyboard {
LinuxKeyboardServiceImpl::LinuxKeyboardServiceImpl(
mojo::InterfaceRequest<keyboard::KeyboardService> request,
mojo::InterfaceRequest<NativeViewportEventDispatcher> dispatcher)
: event_dispatcher_binding_(this, dispatcher.Pass()),
binding_(this, request.Pass()) {
}
LinuxKeyboardServiceImpl::~LinuxKeyboardServiceImpl() {
}
void LinuxKeyboardServiceImpl::Show(
mojo::InterfaceHandle<keyboard::KeyboardClient> client,
keyboard::KeyboardType type) {
client_ = keyboard::KeyboardClientPtr::Create(std::move(client));
}
void LinuxKeyboardServiceImpl::ShowByRequest() {
}
void LinuxKeyboardServiceImpl::Hide() {
client_ = nullptr;
}
void LinuxKeyboardServiceImpl::SetText(const mojo::String& text) {
text_ = text;
}
void LinuxKeyboardServiceImpl::SetSelection(int32_t start, int32_t end) {
// Not applicable for physical keyboards
}
// |mojo::NativeViewportEventDispatcher| implementation:
void LinuxKeyboardServiceImpl::OnEvent(
mojo::EventPtr event,
const OnEventCallback& callback) {
if (event->action == mojo::EventType::KEY_PRESSED &&
event->key_data->is_char) {
if (client_) {
switch(event->key_data->windows_key_code) {
case mojo::KeyboardCode::BACK: // backspace
client_->DeleteSurroundingText(1, 0);
break;
case mojo::KeyboardCode::DELETE:
client_->DeleteSurroundingText(0, 1);
break;
case mojo::KeyboardCode::HOME:
client_->SetSelection(0, 0);
break;
case mojo::KeyboardCode::END:
client_->SetSelection(text_.size()-1, text_.size()-1);
break;
case mojo::KeyboardCode::TAB:
// TODO: Advance focus, in reverse if shifted
break;
case mojo::KeyboardCode::RETURN:
client_->Submit(keyboard::SubmitAction::DONE);
break;
default:
base::string16 character;
character.push_back(event->key_data->character);
std::string s = base::UTF16ToUTF8(character);
text_ += s;
client_->CommitText(mojo::String(s), 1);
break;
}
}
}
callback.Run();
}
} // namespace keyboard