]> Pileus Git - ~andy/gtk/blobdiff - gtk/a11y/gtknotebookaccessible.c
filechooser: Show FUSE mounted locations in shortcuts
[~andy/gtk] / gtk / a11y / gtknotebookaccessible.c
index c4e5b26c94800ff0ebda18ef591e9467b718f8bd..f3b40db1a624544104d6839e5c66e621c0f18216 100644 (file)
@@ -1,4 +1,4 @@
-/* GAIL - The GNOME Accessibility Implementation Library
+/* GTK+ - accessibility implementations
  * Copyright 2001, 2002, 2003 Sun Microsystems Inc.
  *
  * This library is free software; you can redistribute it and/or
@@ -12,9 +12,7 @@
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
  */
 
 #include "config.h"
 #include "gtknotebookaccessible.h"
 #include "gtknotebookpageaccessible.h"
 
+struct _GtkNotebookAccessiblePrivate
+{
+  /*
+   * page_cache maintains a list of pre-ref'd Notebook Pages.
+   * This cache is queried by gtk_notebook_accessible_ref_child().
+   * If the page is found in the list then a new page does not
+   * need to be created
+   */
+  GHashTable * pages;
+  gint         selected_page;
+  gint         focus_tab_page;
+  guint        idle_focus_id;
+};
 
 static void atk_selection_interface_init (AtkSelectionIface *iface);
 
-G_DEFINE_TYPE_WITH_CODE (GtkNotebookAccessible, _gtk_notebook_accessible, GTK_TYPE_CONTAINER_ACCESSIBLE,
+G_DEFINE_TYPE_WITH_CODE (GtkNotebookAccessible, gtk_notebook_accessible, GTK_TYPE_CONTAINER_ACCESSIBLE,
                          G_IMPLEMENT_INTERFACE (ATK_TYPE_SELECTION, atk_selection_interface_init))
 
 static gboolean
@@ -42,16 +53,18 @@ check_focus_tab (gpointer data)
   atk_obj = ATK_OBJECT (data);
   accessible = GTK_NOTEBOOK_ACCESSIBLE (atk_obj);
   widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (atk_obj));
+  if (widget == NULL)
+    return FALSE;
   notebook = GTK_NOTEBOOK (widget);
 
-  accessible->idle_focus_id = 0;
+  accessible->priv->idle_focus_id = 0;
 
   focus_page_num = gtk_notebook_get_current_page (notebook);
   if (focus_page_num == -1)
     return FALSE;
 
-  old_focus_page_num = accessible->focus_tab_page;
-  accessible->focus_tab_page = focus_page_num;
+  old_focus_page_num = accessible->priv->focus_tab_page;
+  accessible->priv->focus_tab_page = focus_page_num;
   if (old_focus_page_num != focus_page_num)
     {
       AtkObject *obj;
@@ -75,8 +88,8 @@ focus_cb (GtkWidget        *widget,
     {
     case GTK_DIR_LEFT:
     case GTK_DIR_RIGHT:
-      if (accessible->idle_focus_id == 0)
-        accessible->idle_focus_id = gdk_threads_add_idle (check_focus_tab, atk_obj);
+      if (accessible->priv->idle_focus_id == 0)
+        accessible->priv->idle_focus_id = gdk_threads_add_idle (check_focus_tab, atk_obj);
       break;
     default:
       break;
@@ -92,8 +105,8 @@ create_notebook_page_accessible (GtkNotebookAccessible *accessible,
 {
   AtkObject *obj;
 
-  obj = _gtk_notebook_page_accessible_new (accessible, child);
-  g_hash_table_insert (accessible->pages, child, obj);
+  obj = gtk_notebook_page_accessible_new (accessible, child);
+  g_hash_table_insert (accessible->priv->pages, child, obj);
   atk_object_set_parent (obj, ATK_OBJECT (accessible));
   g_signal_emit_by_name (accessible, "children-changed::add", page_num, obj, NULL);
 }
@@ -123,26 +136,15 @@ page_removed_cb (GtkNotebook *notebook,
 
   accessible = GTK_NOTEBOOK_ACCESSIBLE (gtk_widget_get_accessible (GTK_WIDGET (notebook)));
 
-  obj = g_hash_table_lookup (accessible->pages, widget);
+  obj = g_hash_table_lookup (accessible->priv->pages, widget);
   g_return_if_fail (obj);
   g_signal_emit_by_name (accessible, "children-changed::remove",
                          page_num, obj, NULL);
-  _gtk_notebook_page_accessible_invalidate (GTK_NOTEBOOK_PAGE_ACCESSIBLE (obj));
-  g_hash_table_remove (accessible->pages, widget);
+  gtk_notebook_page_accessible_invalidate (GTK_NOTEBOOK_PAGE_ACCESSIBLE (obj));
+  g_hash_table_remove (accessible->priv->pages, widget);
 }
 
 
-static void
-accessible_destroyed (gpointer data)
-{
-  GtkNotebookAccessible *accessible = GTK_NOTEBOOK_ACCESSIBLE (data);
-
-  if (accessible->idle_focus_id)
-    {
-      g_source_remove (accessible->idle_focus_id);
-      accessible->idle_focus_id = 0;
-    }
-}
 static void
 gtk_notebook_accessible_initialize (AtkObject *obj,
                                     gpointer   data)
@@ -151,7 +153,7 @@ gtk_notebook_accessible_initialize (AtkObject *obj,
   GtkNotebook *notebook;
   gint i;
 
-  ATK_OBJECT_CLASS (_gtk_notebook_accessible_parent_class)->initialize (obj, data);
+  ATK_OBJECT_CLASS (gtk_notebook_accessible_parent_class)->initialize (obj, data);
 
   accessible = GTK_NOTEBOOK_ACCESSIBLE (obj);
   notebook = GTK_NOTEBOOK (data);
@@ -162,7 +164,7 @@ gtk_notebook_accessible_initialize (AtkObject *obj,
                                        gtk_notebook_get_nth_page (notebook, i),
                                        i);
     }
-  accessible->selected_page = gtk_notebook_get_current_page (notebook);
+  accessible->priv->selected_page = gtk_notebook_get_current_page (notebook);
 
   g_signal_connect (notebook, "focus",
                     G_CALLBACK (focus_cb), NULL);
@@ -171,8 +173,6 @@ gtk_notebook_accessible_initialize (AtkObject *obj,
   g_signal_connect (notebook, "page-removed",
                     G_CALLBACK (page_removed_cb), NULL);
 
-  g_object_weak_ref (G_OBJECT (notebook), (GWeakNotify)accessible_destroyed, obj);
-
   obj->role = ATK_ROLE_PAGE_TAB_LIST;
 }
 
@@ -181,12 +181,12 @@ gtk_notebook_accessible_finalize (GObject *object)
 {
   GtkNotebookAccessible *accessible = GTK_NOTEBOOK_ACCESSIBLE (object);
 
-  g_hash_table_destroy (accessible->pages);
+  g_hash_table_destroy (accessible->priv->pages);
 
-  if (accessible->idle_focus_id)
-    g_source_remove (accessible->idle_focus_id);
+  if (accessible->priv->idle_focus_id)
+    g_source_remove (accessible->priv->idle_focus_id);
 
-  G_OBJECT_CLASS (_gtk_notebook_accessible_parent_class)->finalize (object);
+  G_OBJECT_CLASS (gtk_notebook_accessible_parent_class)->finalize (object);
 }
 
 static AtkObject *
@@ -205,7 +205,7 @@ gtk_notebook_accessible_ref_child (AtkObject *obj,
   accessible = GTK_NOTEBOOK_ACCESSIBLE (obj);
   notebook = GTK_NOTEBOOK (widget);
 
-  child = g_hash_table_lookup (accessible->pages,
+  child = g_hash_table_lookup (accessible->priv->pages,
                                gtk_notebook_get_nth_page (notebook, i));
   /* can return NULL when i >= n_children */
 
@@ -237,11 +237,11 @@ gtk_notebook_accessible_notify_gtk (GObject    *obj,
       notebook = GTK_NOTEBOOK (widget);
 
       /* Notify SELECTED state change for old and new page */
-      old_page_num = accessible->selected_page;
+      old_page_num = accessible->priv->selected_page;
       page_num = gtk_notebook_get_current_page (notebook);
-      accessible->selected_page = page_num;
-      accessible->focus_tab_page = page_num;
-      old_focus_page_num = accessible->focus_tab_page;
+      accessible->priv->selected_page = page_num;
+      accessible->priv->focus_tab_page = page_num;
+      old_focus_page_num = accessible->priv->focus_tab_page;
 
       if (page_num != old_page_num)
         {
@@ -262,10 +262,10 @@ gtk_notebook_accessible_notify_gtk (GObject    *obj,
               atk_object_notify_state_change (child, ATK_STATE_SELECTED, TRUE);
               g_object_unref (child);
               /*
-               * The page which is being displayed has changed but there is
-               * no need to tell the focus tracker as the focus page will also
-               * change or a widget in the page will receive focus if the
-               * Notebook does not have tabs.
+               * The page which is being displayed has changed but there
+               * is no need to tell the focus tracker as the focus page
+               * will also change or a widget in the page will receive
+               * focus if the notebook does not have tabs.
                */
             }
           g_signal_emit_by_name (atk_obj, "selection-changed");
@@ -274,13 +274,13 @@ gtk_notebook_accessible_notify_gtk (GObject    *obj,
       if (gtk_notebook_get_show_tabs (notebook) &&
          (focus_page_num != old_focus_page_num))
         {
-          if (accessible->idle_focus_id)
-            g_source_remove (accessible->idle_focus_id);
-          accessible->idle_focus_id = gdk_threads_add_idle (check_focus_tab, atk_obj);
+          if (accessible->priv->idle_focus_id)
+            g_source_remove (accessible->priv->idle_focus_id);
+          accessible->priv->idle_focus_id = gdk_threads_add_idle (check_focus_tab, atk_obj);
         }
     }
   else
-    GTK_WIDGET_ACCESSIBLE_CLASS (_gtk_notebook_accessible_parent_class)->notify_gtk (obj, pspec);
+    GTK_WIDGET_ACCESSIBLE_CLASS (gtk_notebook_accessible_parent_class)->notify_gtk (obj, pspec);
 }
 
 /*
@@ -305,14 +305,13 @@ gtk_notebook_accessible_add_selection (AtkSelection *selection,
 }
 
 static void
-_gtk_notebook_accessible_class_init (GtkNotebookAccessibleClass *klass)
+gtk_notebook_accessible_class_init (GtkNotebookAccessibleClass *klass)
 {
   GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
   AtkObjectClass  *class = ATK_OBJECT_CLASS (klass);
   GtkWidgetAccessibleClass *widget_class = (GtkWidgetAccessibleClass*)klass;
   GtkContainerAccessibleClass *container_class = (GtkContainerAccessibleClass*)klass;
 
-
   gobject_class->finalize = gtk_notebook_accessible_finalize;
 
   class->ref_child = gtk_notebook_accessible_ref_child;
@@ -323,18 +322,23 @@ _gtk_notebook_accessible_class_init (GtkNotebookAccessibleClass *klass)
   /* we listen to page-added/-removed, so we don't care about these */
   container_class->add_gtk = NULL;
   container_class->remove_gtk = NULL;
+
+  g_type_class_add_private (klass, sizeof (GtkNotebookAccessiblePrivate));
 }
 
 static void
-_gtk_notebook_accessible_init (GtkNotebookAccessible *notebook)
+gtk_notebook_accessible_init (GtkNotebookAccessible *notebook)
 {
-  notebook->pages = g_hash_table_new_full (g_direct_hash,
-                                           g_direct_equal,
-                                           NULL,
-                                           g_object_unref);
-  notebook->selected_page = -1;
-  notebook->focus_tab_page = -1;
-  notebook->idle_focus_id = 0;
+  notebook->priv = G_TYPE_INSTANCE_GET_PRIVATE (notebook,
+                                                GTK_TYPE_NOTEBOOK_ACCESSIBLE,
+                                                GtkNotebookAccessiblePrivate);
+  notebook->priv->pages = g_hash_table_new_full (g_direct_hash,
+                                                 g_direct_equal,
+                                                 NULL,
+                                                 g_object_unref);
+  notebook->priv->selected_page = -1;
+  notebook->priv->focus_tab_page = -1;
+  notebook->priv->idle_focus_id = 0;
 }
 
 static AtkObject *