Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(28)

Unified Diff: ui/aura/remote_root_window_host_win.cc

Issue 83233002: Enable basic IME functionality under Ash on Windows (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix warnings (that are treated as an error) on 64-bit build Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/aura/remote_root_window_host_win.h ('k') | win8/metro_driver/chrome_app_view_ash.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/aura/remote_root_window_host_win.cc
diff --git a/ui/aura/remote_root_window_host_win.cc b/ui/aura/remote_root_window_host_win.cc
index ff52d071ecd696a8f2de7c63e384ad6c7b094403..0b58d1a38310c160147ec0200f012b5e2ccf434f 100644
--- a/ui/aura/remote_root_window_host_win.cc
+++ b/ui/aura/remote_root_window_host_win.cc
@@ -11,9 +11,15 @@
#include "base/message_loop/message_loop.h"
#include "ipc/ipc_message.h"
#include "ipc/ipc_sender.h"
+#include "ui/aura/client/aura_constants.h"
#include "ui/aura/client/cursor_client.h"
#include "ui/aura/root_window.h"
+#include "ui/aura/window_property.h"
#include "ui/base/cursor/cursor_loader_win.h"
+#include "ui/base/ime/composition_text.h"
+#include "ui/base/ime/input_method.h"
+#include "ui/base/ime/remote_input_method_win.h"
+#include "ui/base/ime/text_input_client.h"
#include "ui/events/event_utils.h"
#include "ui/events/keycodes/keyboard_code_conversion_win.h"
#include "ui/base/view_prop.h"
@@ -54,6 +60,25 @@ void SetVirtualKeyStates(uint32 flags) {
::SetKeyboardState(keyboard_state);
}
+void FillCompositionText(
+ const string16& text,
+ int32 selection_start,
+ int32 selection_end,
+ const std::vector<metro_viewer::UnderlineInfo>& underlines,
+ ui::CompositionText* composition_text) {
+ composition_text->Clear();
+ composition_text->text = text;
+ composition_text->selection.set_start(selection_start);
+ composition_text->selection.set_end(selection_end);
+ composition_text->underlines.resize(underlines.size());
+ for (size_t i = 0; i < underlines.size(); ++i) {
+ composition_text->underlines[i].start_offset = underlines[i].start_offset;
+ composition_text->underlines[i].end_offset = underlines[i].end_offset;
+ composition_text->underlines[i].color = SK_ColorBLACK;
+ composition_text->underlines[i].thick = underlines[i].thick;
+ }
+}
+
} // namespace
void HandleOpenFile(const base::string16& title,
@@ -152,6 +177,10 @@ void RemoteRootWindowHostWin::Connected(IPC::Sender* host, HWND remote_window) {
void RemoteRootWindowHostWin::Disconnected() {
// Don't CHECK here, Disconnected is called on a channel error which can
// happen before we're successfully Connected.
+ ui::RemoteInputMethodPrivateWin* remote_input_method_private =
+ GetRemoteInputMethodPrivate();
+ if (remote_input_method_private)
+ remote_input_method_private->SetRemoteDelegate(NULL);
host_ = NULL;
remote_window_ = NULL;
}
@@ -184,6 +213,10 @@ bool RemoteRootWindowHostWin::OnMessageReceived(const IPC::Message& message) {
OnSetCursorPosAck)
IPC_MESSAGE_HANDLER(MetroViewerHostMsg_ActivateDesktopDone,
OnDesktopActivated)
+ IPC_MESSAGE_HANDLER(MetroViewerHostMsg_ImeCompositionChanged,
+ OnImeCompositionChanged)
+ IPC_MESSAGE_HANDLER(MetroViewerHostMsg_ImeTextCommitted,
+ OnImeTextCommitted)
IPC_MESSAGE_UNHANDLED(handled = false)
IPC_END_MESSAGE_MAP()
return handled;
@@ -318,6 +351,10 @@ gfx::AcceleratedWidget RemoteRootWindowHostWin::GetAcceleratedWidget() {
}
void RemoteRootWindowHostWin::Show() {
+ ui::RemoteInputMethodPrivateWin* remote_input_method_private =
+ GetRemoteInputMethodPrivate();
+ if (remote_input_method_private)
+ remote_input_method_private->SetRemoteDelegate(this);
}
void RemoteRootWindowHostWin::Hide() {
@@ -422,6 +459,27 @@ void RemoteRootWindowHostWin::OnDeviceScaleFactorChanged(
void RemoteRootWindowHostWin::PrepareForShutdown() {
}
+void RemoteRootWindowHostWin::CancelComposition() {
+ host_->Send(new MetroViewerHostMsg_ImeCancelComposition);
+}
+
+void RemoteRootWindowHostWin::OnTextInputClientUpdated(
+ const std::vector<int32>& input_scopes,
+ const std::vector<gfx::Rect>& composition_character_bounds) {
+ std::vector<metro_viewer::CharacterBounds> character_bounds;
+ for (size_t i = 0; i < composition_character_bounds.size(); ++i) {
+ const gfx::Rect& rect = composition_character_bounds[i];
+ metro_viewer::CharacterBounds bounds;
+ bounds.left = rect.x();
+ bounds.top = rect.y();
+ bounds.right = rect.right();
+ bounds.bottom = rect.bottom();
+ character_bounds.push_back(bounds);
+ }
+ host_->Send(new MetroViewerHostMsg_ImeTextInputClientUpdated(
+ input_scopes, character_bounds));
+}
+
void RemoteRootWindowHostWin::OnMouseMoved(int32 x, int32 y, int32 flags) {
if (ignore_mouse_moves_until_set_cursor_ack_)
return;
@@ -581,6 +639,36 @@ void RemoteRootWindowHostWin::OnDesktopActivated() {
temp.Run();
}
+ui::RemoteInputMethodPrivateWin*
+RemoteRootWindowHostWin::GetRemoteInputMethodPrivate() {
+ ui::InputMethod* input_method = GetAshWindow()->GetProperty(
+ aura::client::kRootWindowInputMethodKey);
+ return ui::RemoteInputMethodPrivateWin::Get(input_method);
+}
+
+void RemoteRootWindowHostWin::OnImeCompositionChanged(
+ const string16& text,
+ int32 selection_start,
+ int32 selection_end,
+ const std::vector<metro_viewer::UnderlineInfo>& underlines) {
+ ui::RemoteInputMethodPrivateWin* remote_input_method_private =
+ GetRemoteInputMethodPrivate();
+ if (!remote_input_method_private)
+ return;
+ ui::CompositionText composition_text;
+ FillCompositionText(
+ text, selection_start, selection_end, underlines, &composition_text);
+ remote_input_method_private->OnCompositionChanged(composition_text);
+}
+
+void RemoteRootWindowHostWin::OnImeTextCommitted(const string16& text) {
+ ui::RemoteInputMethodPrivateWin* remote_input_method_private =
+ GetRemoteInputMethodPrivate();
+ if (!remote_input_method_private)
+ return;
+ remote_input_method_private->OnTextCommitted(text);
+}
+
void RemoteRootWindowHostWin::DispatchKeyboardMessage(ui::EventType type,
uint32 vkey,
uint32 repeat_count,
« no previous file with comments | « ui/aura/remote_root_window_host_win.h ('k') | win8/metro_driver/chrome_app_view_ash.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698