Index: gailbutton.c
===================================================================
RCS file: /cvs/gnome/gail/gail/gailbutton.c,v
retrieving revision 1.71
diff -u -p -r1.71 gailbutton.c
--- gailbutton.c	11 Mar 2004 09:56:50 -0000	1.71
+++ gailbutton.c	30 Mar 2004 08:10:16 -0000
@@ -295,6 +295,8 @@ gail_button_real_initialize (AtkObject *
 {
   GailButton *button = GAIL_BUTTON (obj);
   GtkWidget  *label;
+  GtkWidget  *widget;
+  GtkWidget  *child;
 
   ATK_OBJECT_CLASS (parent_class)->initialize (obj, data);
 
@@ -318,7 +320,8 @@ gail_button_real_initialize (AtkObject *
                     NULL);
 
 
-  label = get_label_from_button (GTK_WIDGET (data), 0, FALSE);
+  widget = GTK_WIDGET (data);
+  label = get_label_from_button (widget, 0, FALSE);
   if (GTK_IS_LABEL (label))
     {
       if (GTK_WIDGET_MAPPED (label))
@@ -329,6 +332,13 @@ gail_button_real_initialize (AtkObject *
                           G_CALLBACK (gail_button_label_map_gtk),
                           button);
     }
+  child = GTK_BIN (widget)->child;
+  if (GTK_IS_ARROW (child) &&
+      GTK_ARROW (child)->arrow_type == GTK_ARROW_DOWN)
+    button->is_down_arrow = TRUE;
+  else
+    button->is_down_arrow = FALSE;
+    
   set_role_for_button (obj, data);
 
 }
@@ -497,6 +507,13 @@ idle_do_action (gpointer data)
   while (!g_queue_is_empty (gail_button->action_queue)) 
     {
       gint action_number = (gint) g_queue_pop_head (gail_button->action_queue);
+      if (gail_button->is_down_arrow)
+        {
+          if (action_number == 0)
+            action_number = 1;
+          else if (action_number == 1)
+            action_number = 0;
+        }
       switch (action_number)
 	{
 	case 0:
@@ -550,6 +567,13 @@ gail_button_get_description (AtkAction *
 
   button = GAIL_BUTTON (action);
 
+  if (button->is_down_arrow)
+    {
+      if (i == 0)
+        i = 1;
+      else if (i == 1)
+        i = 0;
+    }
   switch (i)
     {
     case 0:
@@ -575,6 +599,14 @@ gail_button_get_keybinding (AtkAction *a
   GailButton *button;
   gchar *return_value = NULL;
 
+  button = GAIL_BUTTON (action);
+  if (button->is_down_arrow)
+    {
+      if (i == 0)
+        i = 1;
+      else if (i == 1)
+        i = 0;
+    }
   switch (i)
     {
     case 0:
@@ -586,7 +618,6 @@ gail_button_get_keybinding (AtkAction *a
         GtkWidget *label;
         guint key_val; 
 
-        button = GAIL_BUTTON (action);
         widget = GTK_ACCESSIBLE (button)->widget;
         if (widget == NULL)
           /*
@@ -650,7 +681,17 @@ gail_button_action_get_name (AtkAction *
                              gint      i)
 {
   G_CONST_RETURN gchar *return_value;
+  GailButton *button;
+
+  button = GAIL_BUTTON (action);
 
+  if (button->is_down_arrow)
+    {
+      if (i == 0)
+        i = 1;
+      else if (i == 1)
+        i = 0;
+    }
   switch (i)
     {
     case 0:
@@ -694,6 +735,13 @@ gail_button_set_description (AtkAction  
 
   button = GAIL_BUTTON (action);
 
+  if (button->is_down_arrow)
+    {
+      if (i == 0)
+        i = 1;
+      else if (i == 1)
+        i = 0;
+    }
   switch (i)
     {
     case 0:
Index: gailbutton.h
===================================================================
RCS file: /cvs/gnome/gail/gail/gailbutton.h,v
retrieving revision 1.12
diff -u -p -r1.12 gailbutton.h
--- gailbutton.h	12 Dec 2002 13:26:52 -0000	1.12
+++ gailbutton.h	30 Mar 2004 08:10:16 -0000
@@ -56,6 +56,8 @@ struct _GailButton
   GQueue        *action_queue;
 
   GailTextUtil	 *textutil;
+
+  gboolean     is_down_arrow;
 };
 
 GType gail_button_get_type (void);
