172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_RENDERER_HOST_GTK_KEY_BINDINGS_HANDLER_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_RENDERER_HOST_GTK_KEY_BINDINGS_HANDLER_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <gtk/gtk.h>
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string>
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/gtk/owned_widget_gtk.h"
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/edit_command.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct NativeWebKeyboardEvent;
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This class is a convenience class for handling editor key bindings defined
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// in gtk keyboard theme.
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// In gtk, only GtkEntry and GtkTextView support customizing editor key bindings
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// through keyboard theme. And in gtk keyboard theme definition file, each key
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// binding must be bound to a specific class or object. So existing keyboard
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// themes only define editor key bindings exactly for GtkEntry and GtkTextView.
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Then, the only way for us to intercept editor key bindings defined in
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// keyboard theme, is to create a GtkEntry or GtkTextView object and call
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// gtk_bindings_activate_event() against it for the key events. If a key event
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// matches a predefined key binding, corresponding signal will be emitted.
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// GtkTextView is used here because it supports more key bindings than GtkEntry,
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// but in order to minimize the side effect of using a GtkTextView object, a new
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// class derived from GtkTextView is used, which overrides all signals related
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// to key bindings, to make sure GtkTextView won't receive them.
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// See third_party/WebKit/Source/WebCore/editing/EditorCommand.cpp for detailed
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// definition of webkit edit commands.
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// See webkit/glue/editor_client_impl.cc for key bindings predefined in our
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// webkit glue.
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass GtkKeyBindingsHandler {
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  explicit GtkKeyBindingsHandler(GtkWidget* parent_widget);
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ~GtkKeyBindingsHandler();
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Matches a key event against predefined gtk key bindings, false will be
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // returned if the key event doesn't correspond to a predefined key binding.
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Edit commands matched with |wke| will be stored in |edit_commands|.
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool Match(const NativeWebKeyboardEvent& wke, EditCommands* edit_commands);
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Object structure of Handler class, which is derived from GtkTextView.
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  struct Handler {
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GtkTextView parent_object;
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GtkKeyBindingsHandler *owner;
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Class structure of Handler class.
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  struct HandlerClass {
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GtkTextViewClass parent_class;
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Creates a new instance of Handler class.
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GtkWidget* CreateNewHandler();
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Adds an edit command to the key event.
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void EditCommandMatched(const std::string& name, const std::string& value);
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Initializes Handler structure.
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static void HandlerInit(Handler *self);
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Initializes HandlerClass structure.
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static void HandlerClassInit(HandlerClass *klass);
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Registeres Handler class to GObject type system and return its type id.
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static GType HandlerGetType();
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Gets the GtkKeyBindingsHandler object which owns the Handler object.
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static GtkKeyBindingsHandler* GetHandlerOwner(GtkTextView* text_view);
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Handler of "backspace" signal.
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static void BackSpace(GtkTextView* text_view);
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Handler of "copy-clipboard" signal.
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static void CopyClipboard(GtkTextView* text_view);
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Handler of "cut-clipboard" signal.
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static void CutClipboard(GtkTextView* text_view);
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Handler of "delete-from-cursor" signal.
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static void DeleteFromCursor(GtkTextView* text_view, GtkDeleteType type,
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               gint count);
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Handler of "insert-at-cursor" signal.
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static void InsertAtCursor(GtkTextView* text_view, const gchar* str);
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Handler of "move-cursor" signal.
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static void MoveCursor(GtkTextView* text_view, GtkMovementStep step,
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         gint count, gboolean extend_selection);
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Handler of "move-viewport" signal.
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static void MoveViewport(GtkTextView* text_view, GtkScrollStep step,
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                           gint count);
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Handler of "paste-clipboard" signal.
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static void PasteClipboard(GtkTextView* text_view);
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Handler of "select-all" signal.
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static void SelectAll(GtkTextView* text_view, gboolean select);
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Handler of "set-anchor" signal.
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static void SetAnchor(GtkTextView* text_view);
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Handler of "toggle-cursor-visible" signal.
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static void ToggleCursorVisible(GtkTextView* text_view);
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Handler of "toggle-overwrite" signal.
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static void ToggleOverwrite(GtkTextView* text_view);
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Handler of "show-help" signal.
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static gboolean ShowHelp(GtkWidget* widget, GtkWidgetHelpType arg1);
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Handler of "move-focus" signal.
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static void MoveFocus(GtkWidget* widget, GtkDirectionType arg1);
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  OwnedWidgetGtk handler_;
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Buffer to store the match results.
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EditCommands edit_commands_;
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_RENDERER_HOST_GTK_KEY_BINDINGS_HANDLER_H_
129