[gtk+] a11y: Check whether a widget is mapped before querying its parent



commit 7e3db6fdd36960fca0ae0e7e078b448b5f8b220a
Author: Mike Gorse <mgorse suse com>
Date:   Fri Aug 30 09:13:39 2013 -0500

    a11y: Check whether a widget is mapped before querying its parent
    
    Call gtk_widget_get_mapped() in a couple of places before looking at the
    widget's parent, since it might be set to a widget that has been
    finalized, causing an invalid read.

 gtk/a11y/gtkwidgetaccessible.c |   14 ++++++++++----
 1 files changed, 10 insertions(+), 4 deletions(-)
---
diff --git a/gtk/a11y/gtkwidgetaccessible.c b/gtk/a11y/gtkwidgetaccessible.c
index 841ae14..dbb7a5b 100644
--- a/gtk/a11y/gtkwidgetaccessible.c
+++ b/gtk/a11y/gtkwidgetaccessible.c
@@ -174,6 +174,9 @@ gtk_widget_accessible_get_parent (AtkObject *accessible)
   if (parent != NULL)
     return parent;
 
+  if (!gtk_widget_get_mapped (widget))
+    return NULL;
+
   parent_widget = gtk_widget_get_parent (widget);
   if (parent_widget == NULL)
     return NULL;
@@ -237,7 +240,7 @@ find_label (GtkWidget *widget)
       temp_widget = label;
       while (temp_widget)
         {
-          if (temp_widget == widget)
+          if (temp_widget == widget || !gtk_widget_get_mapped (temp_widget))
             {
               label = NULL;
               break;
@@ -271,7 +274,7 @@ gtk_widget_accessible_ref_relation_set (AtkObject *obj)
       label = find_label (widget);
       if (label == NULL)
         {
-          if (GTK_IS_BUTTON (widget))
+          if (GTK_IS_BUTTON (widget) && gtk_widget_get_mapped (widget))
             /*
              * Handle the case where GnomeIconEntry is the mnemonic widget.
              * The GtkButton which is a grandchild of the GnomeIconEntry
@@ -293,7 +296,7 @@ gtk_widget_accessible_ref_relation_set (AtkObject *obj)
                     }
                 }
             }
-          else if (GTK_IS_COMBO_BOX (widget))
+          else if (GTK_IS_COMBO_BOX (widget) && gtk_widget_get_mapped (widget))
             /*
              * Handle the case when GtkFileChooserButton is the mnemonic
              * widget.  The GtkComboBox which is a child of the
@@ -440,7 +443,7 @@ gtk_widget_accessible_get_index_in_parent (AtkObject *accessible)
         }
     }
 
-  if (!GTK_IS_WIDGET (widget))
+  if (!GTK_IS_WIDGET (widget) || !gtk_widget_get_mapped (widget))
     return -1;
   parent_widget = gtk_widget_get_parent (widget);
   if (!GTK_IS_CONTAINER (parent_widget))
@@ -781,6 +784,9 @@ gtk_widget_accessible_on_screen (GtkWidget *widget)
 
   gtk_widget_get_allocation (widget, &allocation);
 
+  if (!gtk_widget_get_mapped (widget))
+    return FALSE;
+
   viewport = gtk_widget_get_ancestor (widget, GTK_TYPE_VIEWPORT);
   if (viewport)
     {


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]