gtk+ r19539 - in branches/gtk-2-12: . gtk



Author: matthiasc
Date: Tue Feb 12 16:53:17 2008
New Revision: 19539
URL: http://svn.gnome.org/viewvc/gtk+?rev=19539&view=rev

Log:
2008-02-12  Matthias Clasen  <mclasen redhat com>

        * gtk/gtkiconview.c: Fix state change reporting for
        accessibility.  (#499835, Rich Burridge, patch by LiYan Zhang)




Modified:
   branches/gtk-2-12/ChangeLog
   branches/gtk-2-12/gtk/gtkiconview.c

Modified: branches/gtk-2-12/gtk/gtkiconview.c
==============================================================================
--- branches/gtk-2-12/gtk/gtkiconview.c	(original)
+++ branches/gtk-2-12/gtk/gtkiconview.c	Tue Feb 12 16:53:17 2008
@@ -396,6 +396,8 @@
 									  GtkIconViewItem        *item,
 									  GtkIconViewCellInfo    *cell_info,
 									  GdkEvent               *event);
+static void                 gtk_icon_view_item_selected_changed          (GtkIconView            *icon_view,
+		                                                          GtkIconViewItem        *item);
 static void                 gtk_icon_view_put                            (GtkIconView            *icon_view,
 									  GtkWidget              *widget,
 									  GtkIconViewItem        *item,
@@ -1674,6 +1676,25 @@
 }
 
 static void 
+gtk_icon_view_item_selected_changed (GtkIconView      *icon_view,
+                                     GtkIconViewItem  *item)
+{
+  AtkObject *obj;
+  AtkObject *item_obj;
+
+  obj = gtk_widget_get_accessible (GTK_WIDGET (icon_view));
+  if (obj != NULL)
+    {
+      item_obj = atk_object_ref_accessible_child (obj, item->index);
+      if (item_obj != NULL)
+        {
+          atk_object_notify_state_change (item_obj, ATK_STATE_SELECTED, item->selected);
+          g_object_unref (item_obj);
+        }
+    }
+}
+
+static void 
 gtk_icon_view_put (GtkIconView     *icon_view,
 		   GtkWidget       *widget,
 		   GtkIconViewItem *item,
@@ -2327,6 +2348,7 @@
 	  item->selected = FALSE;
 	  dirty = TRUE;
 	  gtk_icon_view_queue_draw_item (icon_view, item);
+	  gtk_icon_view_item_selected_changed (icon_view, item);
 	}
     }
 
@@ -2475,6 +2497,7 @@
       icon_view->priv->cursor_item->selected = !icon_view->priv->cursor_item->selected;
       g_signal_emit (icon_view, icon_view_signals[SELECTION_CHANGED], 0); 
       
+      gtk_icon_view_item_selected_changed (icon_view, icon_view->priv->cursor_item);      
       gtk_icon_view_queue_draw_item (icon_view, icon_view->priv->cursor_item);
       break;
     }
@@ -3219,14 +3242,23 @@
 {
   AtkObject *obj;
   AtkObject *item_obj;
+  AtkObject *cursor_item_obj;
 
   if (icon_view->priv->cursor_item == item &&
       (cursor_cell < 0 || cursor_cell == icon_view->priv->cursor_cell))
     return;
 
+  obj = gtk_widget_get_accessible (GTK_WIDGET (icon_view));
   if (icon_view->priv->cursor_item != NULL)
-    gtk_icon_view_queue_draw_item (icon_view, icon_view->priv->cursor_item);
-  
+    {
+      gtk_icon_view_queue_draw_item (icon_view, icon_view->priv->cursor_item);
+      if (obj != NULL)
+        {
+          cursor_item_obj = atk_object_ref_accessible_child (obj, icon_view->priv->cursor_item->index);
+          if (cursor_item_obj != NULL)
+            atk_object_notify_state_change (cursor_item_obj, ATK_STATE_FOCUSED, FALSE);
+        }
+    }
   icon_view->priv->cursor_item = item;
   if (cursor_cell >= 0)
     icon_view->priv->cursor_cell = cursor_cell;
@@ -3234,12 +3266,12 @@
   gtk_icon_view_queue_draw_item (icon_view, item);
   
   /* Notify that accessible focus object has changed */
-  obj = gtk_widget_get_accessible (GTK_WIDGET (icon_view));
   item_obj = atk_object_ref_accessible_child (obj, item->index);
 
   if (item_obj != NULL)
     {
       atk_focus_tracker_notify (item_obj);
+      atk_object_notify_state_change (item_obj, ATK_STATE_FOCUSED, TRUE);
       g_object_unref (item_obj); 
     }
 }
@@ -3346,9 +3378,10 @@
 
   item->selected = TRUE;
 
-  gtk_icon_view_queue_draw_item (icon_view, item);
-
+  gtk_icon_view_item_selected_changed (icon_view, item);
   g_signal_emit (icon_view, icon_view_signals[SELECTION_CHANGED], 0);
+
+  gtk_icon_view_queue_draw_item (icon_view, item);
 }
 
 
@@ -3368,6 +3401,7 @@
   
   item->selected = FALSE;
 
+  gtk_icon_view_item_selected_changed (icon_view, item);
   g_signal_emit (icon_view, icon_view_signals[SELECTION_CHANGED], 0);
 
   gtk_icon_view_queue_draw_item (icon_view, item);
@@ -3865,10 +3899,11 @@
 	  col1 <= item->col && item->col <= col2)
 	{
 	  if (!item->selected)
-	    dirty = TRUE;
-
-	  item->selected = TRUE;
-	  
+	    {
+	      dirty = TRUE;
+	      item->selected = TRUE;
+	      gtk_icon_view_item_selected_changed (icon_view, item);
+	    }
 	  gtk_icon_view_queue_draw_item (icon_view, item);
 	}
     }
@@ -8497,6 +8532,10 @@
     atk_state_set_add_state (item->state_set, ATK_STATE_FOCUSED);
   else
     atk_state_set_remove_state (item->state_set, ATK_STATE_FOCUSED);
+  if (item->item->selected)
+    atk_state_set_add_state (item->state_set, ATK_STATE_SELECTED);
+  else
+    atk_state_set_remove_state (item->state_set, ATK_STATE_SELECTED);
 
   return g_object_ref (item->state_set);
 }



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