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

Unified Diff: views/widget/widget_win.cc

Issue 6675005: Integrate the new input method API for Views into Chromium. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase Created 9 years, 9 months 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
« views/focus/focus_manager.cc ('K') | « views/widget/widget_win.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: views/widget/widget_win.cc
diff --git a/views/widget/widget_win.cc b/views/widget/widget_win.cc
index 8db1a2ca666b18513d66aeb9e1ab2012ba7ae867..0def06996768a23032064dc54b65fcc3e7b0c280 100644
--- a/views/widget/widget_win.cc
+++ b/views/widget/widget_win.cc
@@ -23,9 +23,11 @@
#include "ui/gfx/path.h"
#include "views/accessibility/native_view_accessibility_win.h"
#include "views/controls/native_control_win.h"
+#include "views/controls/textfield/native_textfield_views.h"
#include "views/focus/accelerator_handler.h"
#include "views/focus/focus_util_win.h"
#include "views/focus/view_storage.h"
+#include "views/ime/input_method_win.h"
#include "views/views_delegate.h"
#include "views/widget/aero_tooltip_manager.h"
#include "views/widget/child_window_message_processor.h"
@@ -145,11 +147,15 @@ WidgetWin::WidgetWin()
restore_focus_when_enabled_(false),
accessibility_view_events_index_(-1),
accessibility_view_events_(kMaxAccessibilityViewEvents),
- previous_cursor_(NULL) {
+ previous_cursor_(NULL),
+ is_input_method_win_(false) {
set_native_widget(this);
}
WidgetWin::~WidgetWin() {
+ // We need to delete the input method before calling DestroyRootView(),
+ // because it'll set focus_manager_ to NULL.
+ input_method_.reset();
DestroyRootView();
}
@@ -334,6 +340,19 @@ bool WidgetWin::HasNativeCapture() const {
return GetCapture() == hwnd();
}
+InputMethod* WidgetWin::GetInputMethodNative() {
+ return input_method_.get();
+}
+
+void WidgetWin::ReplaceInputMethod(InputMethod* input_method) {
+ input_method_.reset(input_method);
+ if (input_method) {
+ input_method->set_delegate(this);
+ input_method->Init(GetWidget());
+ }
+ is_input_method_win_ = false;
+}
+
gfx::Rect WidgetWin::GetWindowScreenBounds() const {
RECT r;
GetWindowRect(&r);
@@ -384,6 +403,11 @@ void WidgetWin::Close() {
}
void WidgetWin::CloseNow() {
+ // Destroys the input method before closing the window so that it can be
+ // detached from the widget correctly.
+ input_method_.reset();
+ is_input_method_win_ = false;
+
// We may already have been destroyed if the selection resulted in a tab
// switch which will have reactivated the browser window and closed us, so
// we need to check to see if we're still a window before trying to destroy
@@ -623,6 +647,15 @@ LRESULT WidgetWin::OnCreate(CREATESTRUCT* create_struct) {
ClientAreaSizeChanged();
delegate_->OnNativeWidgetCreated();
+
+ // delegate_->OnNativeWidgetCreated() creates the focus manager for top-level
+ // widget. Only top-level widget should have an input method.
+ if (delegate_->HasFocusManager() &&
+ NativeTextfieldViews::IsTextfieldViewsEnabled()) {
+ input_method_.reset(new InputMethodWin(this));
+ input_method_->Init(GetWidget());
+ is_input_method_win_ = true;
+ }
return 0;
}
@@ -702,6 +735,45 @@ void WidgetWin::OnHScroll(int scroll_type, short position, HWND scrollbar) {
SetMsgHandled(FALSE);
}
+LRESULT WidgetWin::OnImeMessages(UINT message, WPARAM w_param, LPARAM l_param) {
+ if (!is_input_method_win_) {
+ SetMsgHandled(FALSE);
+ return 0;
+ }
+
+ InputMethodWin* ime = static_cast<InputMethodWin*>(input_method_.get());
+ BOOL handled = FALSE;
+ LRESULT result = 0;
+ switch (message) {
+ case WM_IME_SETCONTEXT:
+ result = ime->OnImeSetContext(message, w_param, l_param, &handled);
+ break;
+ case WM_IME_STARTCOMPOSITION:
+ result = ime->OnImeStartComposition(message, w_param, l_param, &handled);
+ break;
+ case WM_IME_COMPOSITION:
+ result = ime->OnImeComposition(message, w_param, l_param, &handled);
+ break;
+ case WM_IME_ENDCOMPOSITION:
+ result = ime->OnImeEndComposition(message, w_param, l_param, &handled);
+ break;
+ case WM_CHAR:
+ case WM_SYSCHAR:
+ result = ime->OnChar(message, w_param, l_param, &handled);
+ break;
+ case WM_DEADCHAR:
+ case WM_SYSDEADCHAR:
+ result = ime->OnDeadChar(message, w_param, l_param, &handled);
+ break;
+ default:
+ NOTREACHED() << "Unknown IME message:" << message;
+ break;
+ }
+
+ SetMsgHandled(handled);
+ return result;
+}
+
void WidgetWin::OnInitMenu(HMENU menu) {
SetMsgHandled(FALSE);
}
@@ -712,30 +784,39 @@ void WidgetWin::OnInitMenuPopup(HMENU menu,
SetMsgHandled(FALSE);
}
-LRESULT WidgetWin::OnKeyDown(UINT message, WPARAM w_param, LPARAM l_param) {
- RootView* root_view = GetFocusedViewRootView();
- if (!root_view)
- root_view = GetRootView();
+void WidgetWin::OnInputLangChange(DWORD character_set, HKL input_language_id) {
+ if (is_input_method_win_) {
+ static_cast<InputMethodWin*>(input_method_.get())->OnInputLangChange(
+ character_set, input_language_id);
+ }
+}
+LRESULT WidgetWin::OnKeyDown(UINT message, WPARAM w_param, LPARAM l_param) {
MSG msg;
MakeMSG(&msg, message, w_param, l_param);
- SetMsgHandled(root_view->ProcessKeyEvent(KeyEvent(msg)));
+ KeyEvent key(msg);
+ if (input_method_.get())
+ input_method_->DispatchKeyEvent(key);
+ else
+ DispatchKeyEventPostIME(key);
return 0;
}
LRESULT WidgetWin::OnKeyUp(UINT message, WPARAM w_param, LPARAM l_param) {
- RootView* root_view = GetFocusedViewRootView();
- if (!root_view)
- root_view = GetRootView();
-
MSG msg;
MakeMSG(&msg, message, w_param, l_param);
- SetMsgHandled(root_view->ProcessKeyEvent(KeyEvent(msg)));
+ KeyEvent key(msg);
+ if (input_method_.get())
+ input_method_->DispatchKeyEvent(key);
+ else
+ DispatchKeyEventPostIME(key);
return 0;
}
void WidgetWin::OnKillFocus(HWND focused_window) {
delegate_->OnNativeBlur(focused_window);
+ if (input_method_.get())
+ input_method_->OnFocusOut();
SetMsgHandled(FALSE);
}
@@ -915,6 +996,8 @@ LRESULT WidgetWin::OnReflectedMessage(UINT msg,
void WidgetWin::OnSetFocus(HWND focused_window) {
delegate_->OnNativeFocus(focused_window);
+ if (input_method_.get())
+ input_method_->OnFocusIn();
SetMsgHandled(FALSE);
}
@@ -1197,6 +1280,14 @@ gfx::AcceleratedWidget WidgetWin::GetAcceleratedWidget() {
return gfx::kNullAcceleratedWidget;
}
+void WidgetWin::DispatchKeyEventPostIME(const KeyEvent& key) {
+ RootView* root_view = GetFocusedViewRootView();
+ if (!root_view)
+ root_view = GetRootView();
+
+ SetMsgHandled(root_view->ProcessKeyEvent(key));
+}
+
////////////////////////////////////////////////////////////////////////////////
// Widget, public:
« views/focus/focus_manager.cc ('K') | « views/widget/widget_win.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698