15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/text_services_message_filter.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace win {
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TextServicesMessageFilter::TextServicesMessageFilter()
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : client_id_(TF_CLIENTID_NULL),
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_initialized_(false) {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TextServicesMessageFilter::~TextServicesMessageFilter() {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_initialized_)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    thread_mgr_->Deactivate();
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TextServicesMessageFilter::Init() {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (FAILED(thread_mgr_.CreateInstance(CLSID_TF_ThreadMgr)))
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (FAILED(message_pump_.QueryFrom(thread_mgr_)))
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (FAILED(keystroke_mgr_.QueryFrom(thread_mgr_)))
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (FAILED(thread_mgr_->Activate(&client_id_)))
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_initialized_ = true;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return is_initialized_;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Wraps for ITfMessagePump::PeekMessage with win32 PeekMessage signature.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Obtains messages from application message queue.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BOOL TextServicesMessageFilter::DoPeekMessage(MSG* msg,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              HWND window_handle,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              UINT msg_filter_min,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              UINT msg_filter_max,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              UINT remove_msg) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BOOL result = FALSE;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (FAILED(message_pump_->PeekMessage(msg, window_handle,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        msg_filter_min, msg_filter_max,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        remove_msg, &result))) {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result = FALSE;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sends message to Text Service Manager.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The message will be used to input composition text.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true if |message| was consumed by text service manager.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TextServicesMessageFilter::ProcessMessage(const MSG& msg) {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (msg.message == WM_KEYDOWN) {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BOOL eaten = FALSE;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HRESULT hr = keystroke_mgr_->TestKeyDown(msg.wParam, msg.lParam, &eaten);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (FAILED(hr) && !eaten)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    eaten = FALSE;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    hr = keystroke_mgr_->KeyDown(msg.wParam, msg.lParam, &eaten);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (SUCCEEDED(hr) && !!eaten);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (msg.message == WM_KEYUP) {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BOOL eaten = FALSE;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HRESULT hr = keystroke_mgr_->TestKeyUp(msg.wParam, msg.lParam, &eaten);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (FAILED(hr) && !eaten)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    eaten = FALSE;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    hr = keystroke_mgr_->KeyUp(msg.wParam, msg.lParam, &eaten);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (SUCCEEDED(hr) && !!eaten);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace win
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace base
83