#ifndef UI_GTK_INPUT_METHOD_CONTEXT_IMPL_GTK_H_
#define UI_GTK_INPUT_METHOD_CONTEXT_IMPL_GTK_H_
#include <string>
#include "base/memory/raw_ptr.h"
#include "ui/base/glib/glib_integers.h"
#include "ui/base/glib/glib_signal.h"
#include "ui/base/ime/linux/linux_input_method_context.h"
#include "ui/gfx/geometry/rect.h"
using GtkIMContext = struct _GtkIMContext;
using GdkWindow = struct _GdkWindow;
namespace gtk {
class InputMethodContextImplGtk : public ui::LinuxInputMethodContext {
public:
explicit InputMethodContextImplGtk(
ui::LinuxInputMethodContextDelegate* delegate);
InputMethodContextImplGtk(const InputMethodContextImplGtk&) = delete;
InputMethodContextImplGtk& operator=(const InputMethodContextImplGtk&) =
delete;
~InputMethodContextImplGtk() override;
bool DispatchKeyEvent(const ui::KeyEvent& key_event) override;
bool IsPeekKeyEvent(const ui::KeyEvent& key_event) override;
void SetCursorLocation(const gfx::Rect& rect) override;
void Reset() override;
void UpdateFocus(bool has_client,
ui::TextInputType old_type,
ui::TextInputType new_type,
ui::TextInputClient::FocusReason reason) override;
void SetSurroundingText(
const std::u16string& text,
const gfx::Range& text_range,
const gfx::Range& selection_range,
const absl::optional<ui::GrammarFragment>& fragment,
const absl::optional<ui::AutocorrectInfo>& autocorrect) override;
void SetContentType(ui::TextInputType type,
ui::TextInputMode mode,
uint32_t flags,
bool should_do_learning,
bool can_compose_inline) override;
ui::VirtualKeyboardController* GetVirtualKeyboardController() override;
private:
CHROMEG_CALLBACK_1(InputMethodContextImplGtk,
void,
OnCommit,
GtkIMContext*,
gchar*);
CHROMEG_CALLBACK_0(InputMethodContextImplGtk,
void,
OnPreeditChanged,
GtkIMContext*);
CHROMEG_CALLBACK_0(InputMethodContextImplGtk,
void,
OnPreeditEnd,
GtkIMContext*);
CHROMEG_CALLBACK_0(InputMethodContextImplGtk,
void,
OnPreeditStart,
GtkIMContext*);
void SetContextClientWindow(GdkWindow* window, GtkIMContext* gtk_context);
GtkIMContext* GetIMContext();
const raw_ptr<ui::LinuxInputMethodContextDelegate> delegate_;
ui::TextInputType type_ = ui::TEXT_INPUT_TYPE_NONE;
raw_ptr<GtkIMContext> gtk_context_ = nullptr;
raw_ptr<GtkIMContext> gtk_simple_context_ = nullptr;
gpointer gdk_last_set_client_window_ = nullptr;
gpointer gdk_last_set_client_window_for_simple_ = nullptr;
gfx::Rect last_caret_bounds_;
};
}
#endif