gtk_key_bindings_handler.h revision 72a454cd3513ac24fbdd0e0cb9ad70b86a99b801
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" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/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