Index: chrome/browser/gtk/accessibility_event_router_gtk.h |
=================================================================== |
--- chrome/browser/gtk/accessibility_event_router_gtk.h (revision 0) |
+++ chrome/browser/gtk/accessibility_event_router_gtk.h (revision 0) |
@@ -0,0 +1,130 @@ |
+// Copyright (c) 2010 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 CHROME_BROWSER_GTK_ACCESSIBILITY_EVENT_ROUTER_GTK_H_ |
+#define CHROME_BROWSER_GTK_ACCESSIBILITY_EVENT_ROUTER_GTK_H_ |
+ |
+#include <gtk/gtk.h> |
+ |
+#include <string> |
+#include <vector> |
+ |
+#include "base/basictypes.h" |
+#include "base/hash_tables.h" |
+#include "base/singleton.h" |
+#include "chrome/common/accessibility_events.h" |
+ |
+class Profile; |
+ |
+// Allows us to use (GtkWidget*) in a hash_map with gcc. |
+namespace __gnu_cxx { |
+template<> |
+struct hash<GtkWidget*> { |
+ size_t operator()(GtkWidget* widget) const { |
+ return reinterpret_cast<size_t>(widget); |
+ } |
+}; |
+} // namespace __gnu_cxx |
+ |
+// Singleton class that adds a signal emission hook to many gtk events, and |
+// then sends an accessibility notification whenever a relevant event is |
+// sent to an accessible control. |
+// |
+// Gtk widgets are not accessible by default. When you register a root widget, |
+// that widget and all of its descendants will start sending accessibility |
+// event notifications. You can then override the default behavior for |
+// specific descendants using other methods. |
+// |
+// You can use Profile::PauseAccessibilityEvents to prevent a flurry |
+// of accessibility events when a window is being created or initialized. |
+class AccessibilityEventRouter { |
+ public: |
+ // Internal information about a particular widget to override the |
+ // information we get directly from gtk. |
+ struct WidgetInfo { |
+ // If nonempty, will use this name instead of the widget's label. |
+ std::string name; |
+ |
+ // If true, will ignore this widget and not send accessibility events. |
+ bool ignore; |
+ }; |
+ |
+ // Get the single instance of this class. |
+ static AccessibilityEventRouter* GetInstance(); |
+ |
+ // Start sending accessibility events for this widget and all of its |
+ // descendants. Notifications will go to the specified profile. |
+ void AddRootWidget(GtkWidget* root_widget, Profile* profile); |
+ |
+ // Stop sending accessibility events for this widget and all of its |
+ // descendants. |
+ void RemoveRootWidget(GtkWidget* root_widget); |
+ |
+ // Don't send any events for this widget. |
+ void IgnoreWidget(GtkWidget* widget); |
+ |
+ // Use the following string as the name of this widget, instead of the |
+ // gtk label associated with the widget. |
+ void SetWidgetName(GtkWidget* widget, std::string name); |
+ |
+ // Forget all information about this widget. |
+ void RemoveWidget(GtkWidget* widget); |
+ |
+ // |
+ // The following methods are only for use by gtk signal handlers. |
+ // |
+ |
+ // Returns true if this widget is a descendant of one of our registered |
+ // root widgets and not in the set of ignored widgets. If |profile| is |
+ // not null, return the profile where notifications associated with this |
+ // widget should be sent. |
+ bool IsWidgetAccessible(GtkWidget* widget, Profile** profile); |
+ |
+ // Return the name of a widget. |
+ std::string GetWidgetName(GtkWidget* widget); |
+ |
+ // Called by the signal handler. Checks the type of the widget and |
+ // calls one of the more specific Send*Notification methods, below. |
+ void DispatchAccessibilityNotification( |
+ GtkWidget* widget, NotificationType type); |
+ |
+ // Each of these methods constructs an AccessibilityControlInfo object |
+ // and sends a notification of a specific accessibility event. |
+ void SendRadioButtonNotification( |
+ GtkWidget* widget, NotificationType type, Profile* profile); |
+ void SendCheckboxNotification( |
+ GtkWidget* widget, NotificationType type, Profile* profile); |
+ void SendButtonNotification( |
+ GtkWidget* widget, NotificationType type, Profile* profile); |
+ void SendTextBoxNotification( |
+ GtkWidget* widget, NotificationType type, Profile* profile); |
+ void SendTabNotification( |
+ GtkWidget* widget, NotificationType type, Profile* profile); |
+ |
+ void InstallEventListeners(); |
+ void RemoveEventListeners(); |
+ |
+ private: |
+ AccessibilityEventRouter(); |
+ virtual ~AccessibilityEventRouter() {} |
+ |
+ friend struct DefaultSingletonTraits<AccessibilityEventRouter>; |
+ |
+ // The set of all root widgets; only descendants of these will generate |
+ // accessibility notifications. |
+ base::hash_map<GtkWidget*, Profile*> root_widget_profile_map_; |
+ |
+ // Extra information about specific widgets. |
+ base::hash_map<GtkWidget*, WidgetInfo> widget_info_map_; |
+ |
+ // Installed event listener hook ids so we can remove them later. |
+ gulong focus_hook_; |
+ gulong click_hook_; |
+ gulong toggle_hook_; |
+ gulong switch_page_hook_; |
+ |
+ std::vector<gulong> event_listener_hook_ids_; |
+}; |
+ |
+#endif // CHROME_BROWSER_GTK_ACCESSIBILITY_EVENT_ROUTER_GTK_H_ |
Property changes on: chrome/browser/gtk/accessibility_event_router_gtk.h |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |