// Copyright 2013 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.

#ifndef UI_BASE_IME_INPUT_METHOD_AURALINUX_H_
#define UI_BASE_IME_INPUT_METHOD_AURALINUX_H_

#include "base/memory/scoped_ptr.h"
#include "ui/base/ime/input_method_base.h"
#include "ui/base/ime/linux/linux_input_method_context.h"

namespace ui {

// A ui::InputMethod implementation for Aura on Linux platforms. The
// implementation details are separated to ui::LinuxInputMethodContext
// interface.
class UI_BASE_EXPORT InputMethodAuraLinux
    : public InputMethodBase,
      public LinuxInputMethodContextDelegate {
 public:
  explicit InputMethodAuraLinux(internal::InputMethodDelegate* delegate);
  virtual ~InputMethodAuraLinux();

  // Overriden from InputMethod.
  virtual void Init(bool focused) override;
  virtual bool OnUntranslatedIMEMessage(const base::NativeEvent& event,
                                        NativeEventResult* result) override;
  virtual bool DispatchKeyEvent(const ui::KeyEvent& event) override;
  virtual void OnTextInputTypeChanged(const TextInputClient* client) override;
  virtual void OnCaretBoundsChanged(const TextInputClient* client) override;
  virtual void CancelComposition(const TextInputClient* client) override;
  virtual void OnInputLocaleChanged() override;
  virtual std::string GetInputLocale() override;
  virtual bool IsActive() override;
  virtual bool IsCandidatePopupOpen() const override;

  // Overriden from ui::LinuxInputMethodContextDelegate
  virtual void OnCommit(const base::string16& text) override;
  virtual void OnPreeditChanged(const CompositionText& composition_text)
      override;
  virtual void OnPreeditEnd() override;
  virtual void OnPreeditStart() override;

 protected:
  // Overridden from InputMethodBase.
  virtual void OnDidChangeFocusedClient(TextInputClient* focused_before,
                                        TextInputClient* focused) override;

 private:
  // Allows to fire a VKEY_PROCESSKEY key event.
  void AllowToFireProcessKey(const ui::KeyEvent& event);
  // Fires a VKEY_PROCESSKEY key event if allowed.
  void MaybeFireProcessKey();
  // Stops firing VKEY_PROCESSKEY key events.
  void StopFiringProcessKey();

  scoped_ptr<LinuxInputMethodContext> input_method_context_;

  // IBus in async mode eagerly consumes all the key events first regardless of
  // whether the underlying IME consumes the key event or not, and makes
  // gtk_im_context_filter_keypress() always return true, and later pushes
  // the key event back to the GDK event queue when it turns out that the
  // underlying IME doesn't consume the key event.
  //
  // Thus we have to defer a decision whether or not to dispatch a
  // VKEY_PROCESSKEY key event.  Unlike other InputMethod's subclasses,
  // DispatchKeyEvent() in this class does not directly dispatch a
  // VKEY_PROCESSKEY event, OnCommit or OnPreedit{Start,Changed,End} dispatch
  // a VKEY_PROCESSKEY event instead.
  //
  // Because of this hack, there could be chances that we accidentally dispatch
  // VKEY_PROCESSKEY events and other key events in out of order.
  //
  // |allowed_to_fire_vkey_process_key_| is used not to dispatch a
  // VKEY_PROCESSKEY event twice for a single key event.
  bool allowed_to_fire_vkey_process_key_;
  int vkey_processkey_flags_;

  DISALLOW_COPY_AND_ASSIGN(InputMethodAuraLinux);
};

}  // namespace ui

#endif  // UI_BASE_IME_INPUT_METHOD_AURALINUX_H_
