]> Pileus Git - ~andy/gtk/blobdiff - modules/other/gail/gailcheckmenuitem.c
gail: support indeterminate state of check menuitems
[~andy/gtk] / modules / other / gail / gailcheckmenuitem.c
index 362562d4caf3701925fd9cce723b5ff0698e913c..52b588f1a1ab519b08047c4e7cd311047a71e869 100644 (file)
  * Boston, MA 02111-1307, USA.
  */
 
-#include <config.h>
+#include "config.h"
 
 #include <string.h>
-#include <gtk/gtk.h>
 #include "gailcheckmenuitem.h"
 #include "gailchecksubmenuitem.h"
 
@@ -101,7 +100,7 @@ gail_check_menu_item_toggled_gtk (GtkWidget       *widget)
 
   accessible = gtk_widget_get_accessible (widget);
   atk_object_notify_state_change (accessible, ATK_STATE_CHECKED, 
-                                  check_menu_item->active);
+                                  gtk_check_menu_item_get_active (check_menu_item));
 } 
 
 static AtkStateSet*
@@ -112,7 +111,7 @@ gail_check_menu_item_ref_state_set (AtkObject *accessible)
   GtkWidget *widget;
 
   state_set = ATK_OBJECT_CLASS (gail_check_menu_item_parent_class)->ref_state_set (accessible);
-  widget = GTK_ACCESSIBLE (accessible)->widget;
+  widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (accessible));
  
   if (widget == NULL)
     return state_set;
@@ -123,7 +122,10 @@ gail_check_menu_item_ref_state_set (AtkObject *accessible)
     atk_state_set_add_state (state_set, ATK_STATE_CHECKED);
 
   if (gtk_check_menu_item_get_inconsistent (check_menu_item))
-    atk_state_set_remove_state (state_set, ATK_STATE_ENABLED);
+    {
+      atk_state_set_remove_state (state_set, ATK_STATE_ENABLED);
+      atk_state_set_add_state (state_set, ATK_STATE_INDETERMINATE);
+    }
  
   return state_set;
 }
@@ -134,12 +136,24 @@ gail_check_menu_item_real_notify_gtk (GObject           *obj,
 {
   GtkCheckMenuItem *check_menu_item = GTK_CHECK_MENU_ITEM (obj);
   AtkObject *atk_obj;
+  gboolean sensitive;
+  gboolean inconsistent;
 
   atk_obj = gtk_widget_get_accessible (GTK_WIDGET (check_menu_item));
+  sensitive = gtk_widget_get_sensitive (GTK_WIDGET (check_menu_item));
+  inconsistent = gtk_check_menu_item_get_inconsistent (check_menu_item);
 
   if (strcmp (pspec->name, "inconsistent") == 0)
-    atk_object_notify_state_change (atk_obj, ATK_STATE_ENABLED,
-                       !gtk_check_menu_item_get_inconsistent (check_menu_item));
+    {
+      atk_object_notify_state_change (atk_obj, ATK_STATE_INDETERMINATE, inconsistent);
+      atk_object_notify_state_change (atk_obj, ATK_STATE_ENABLED, (sensitive && !inconsistent));
+    }
+  else if (strcmp (pspec->name, "sensitive") == 0)
+    {
+      /* Need to override gailwidget behavior of notifying for ENABLED */
+      atk_object_notify_state_change (atk_obj, ATK_STATE_SENSITIVE, sensitive);
+      atk_object_notify_state_change (atk_obj, ATK_STATE_ENABLED, (sensitive && !inconsistent));
+    }
   else
     GAIL_WIDGET_CLASS (gail_check_menu_item_parent_class)->notify_gtk (obj, pspec);
 }