]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkcheckmenuitem.c
Adapt cast macros to standard.
[~andy/gtk] / gtk / gtkcheckmenuitem.c
index a36dfa75a0d9d1d83a912a1348b98c1b019d992f..852a7ba0e22809667463be569ae4e04926c7c2d3 100644 (file)
  * Library General Public License for more details.
  *
  * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free
- * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
  */
+
+/*
+ * Modified by the GTK+ Team and others 1997-1999.  See the AUTHORS
+ * file for a list of people on the GTK+ Team.  See the ChangeLog
+ * files for a list of changes.  These files are distributed with
+ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
+ */
+
 #include "gtkcheckmenuitem.h"
-#include "gtklabel.h"
+#include "gtkaccellabel.h"
 #include "gtksignal.h"
 
 
@@ -43,109 +52,124 @@ static void gtk_real_check_menu_item_draw_indicator (GtkCheckMenuItem      *chec
 
 
 static GtkMenuItemClass *parent_class = NULL;
-static gint check_menu_item_signals[LAST_SIGNAL] = { 0 };
+static guint check_menu_item_signals[LAST_SIGNAL] = { 0 };
 
 
-guint
-gtk_check_menu_item_get_type ()
+GtkType
+gtk_check_menu_item_get_type (void)
 {
-  static guint check_menu_item_type = 0;
+  static GtkType check_menu_item_type = 0;
 
   if (!check_menu_item_type)
     {
-      GtkTypeInfo check_menu_item_info =
+      static const GtkTypeInfo check_menu_item_info =
       {
         "GtkCheckMenuItem",
         sizeof (GtkCheckMenuItem),
         sizeof (GtkCheckMenuItemClass),
         (GtkClassInitFunc) gtk_check_menu_item_class_init,
         (GtkObjectInitFunc) gtk_check_menu_item_init,
-        (GtkArgFunc) NULL,
+        /* reserved_1 */ NULL,
+        /* reserved_2 */ NULL,
+        (GtkClassInitFunc) NULL,
       };
 
-      check_menu_item_type = gtk_type_unique (gtk_menu_item_get_type (), &check_menu_item_info);
+      check_menu_item_type = gtk_type_unique (GTK_TYPE_MENU_ITEM, &check_menu_item_info);
     }
 
   return check_menu_item_type;
 }
 
+static void
+gtk_check_menu_item_class_init (GtkCheckMenuItemClass *klass)
+{
+  GtkObjectClass *object_class;
+  GtkWidgetClass *widget_class;
+  GtkMenuItemClass *menu_item_class;
+  
+  object_class = (GtkObjectClass*) klass;
+  widget_class = (GtkWidgetClass*) klass;
+  menu_item_class = (GtkMenuItemClass*) klass;
+  
+  parent_class = gtk_type_class (GTK_TYPE_MENU_ITEM);
+  
+  widget_class->draw = gtk_check_menu_item_draw;
+  widget_class->expose_event = gtk_check_menu_item_expose;
+  
+  menu_item_class->activate = gtk_check_menu_item_activate;
+  menu_item_class->toggle_size = 12;
+  menu_item_class->hide_on_activate = FALSE;
+  
+  klass->toggled = NULL;
+  klass->draw_indicator = gtk_real_check_menu_item_draw_indicator;
+
+  check_menu_item_signals[TOGGLED] =
+    gtk_signal_new ("toggled",
+                    GTK_RUN_FIRST,
+                    object_class->type,
+                    GTK_SIGNAL_OFFSET (GtkCheckMenuItemClass, toggled),
+                    gtk_marshal_NONE__NONE,
+                   GTK_TYPE_NONE, 0);
+  gtk_object_class_add_signals (object_class, check_menu_item_signals, LAST_SIGNAL);
+}
+
 GtkWidget*
-gtk_check_menu_item_new ()
+gtk_check_menu_item_new (void)
 {
-  return GTK_WIDGET (gtk_type_new (gtk_check_menu_item_get_type ()));
+  return GTK_WIDGET (gtk_type_new (GTK_TYPE_CHECK_MENU_ITEM));
 }
 
 GtkWidget*
 gtk_check_menu_item_new_with_label (const gchar *label)
 {
   GtkWidget *check_menu_item;
-  GtkWidget *label_widget;
+  GtkWidget *accel_label;
 
   check_menu_item = gtk_check_menu_item_new ();
-  label_widget = gtk_label_new (label);
-  gtk_misc_set_alignment (GTK_MISC (label_widget), 0.0, 0.5);
+  accel_label = gtk_accel_label_new (label);
+  gtk_misc_set_alignment (GTK_MISC (accel_label), 0.0, 0.5);
 
-  gtk_container_add (GTK_CONTAINER (check_menu_item), label_widget);
-  gtk_widget_show (label_widget);
+  gtk_container_add (GTK_CONTAINER (check_menu_item), accel_label);
+  gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (accel_label), check_menu_item);
+  gtk_widget_show (accel_label);
 
   return check_menu_item;
 }
 
 void
-gtk_check_menu_item_set_state (GtkCheckMenuItem *check_menu_item,
-                              gint              state)
+gtk_check_menu_item_set_active (GtkCheckMenuItem *check_menu_item,
+                               gboolean          is_active)
 {
   g_return_if_fail (check_menu_item != NULL);
   g_return_if_fail (GTK_IS_CHECK_MENU_ITEM (check_menu_item));
 
-  if (check_menu_item->active != state)
+  is_active = is_active != 0;
+
+  if (check_menu_item->active != is_active)
     gtk_menu_item_activate (GTK_MENU_ITEM (check_menu_item));
 }
 
 void
-gtk_check_menu_item_toggled (GtkCheckMenuItem *check_menu_item)
+gtk_check_menu_item_set_show_toggle (GtkCheckMenuItem *menu_item,
+                                    gboolean          always)
 {
-  gtk_signal_emit (GTK_OBJECT (check_menu_item), check_menu_item_signals[TOGGLED]);
+  g_return_if_fail (menu_item != NULL);
+  g_return_if_fail (GTK_IS_CHECK_MENU_ITEM (menu_item));
+  
+  menu_item->always_show_toggle = always != FALSE;
 }
 
-
-static void
-gtk_check_menu_item_class_init (GtkCheckMenuItemClass *klass)
+void
+gtk_check_menu_item_toggled (GtkCheckMenuItem *check_menu_item)
 {
-  GtkObjectClass *object_class;
-  GtkWidgetClass *widget_class;
-  GtkMenuItemClass *menu_item_class;
-
-  object_class = (GtkObjectClass*) klass;
-  widget_class = (GtkWidgetClass*) klass;
-  menu_item_class = (GtkMenuItemClass*) klass;
-
-  parent_class = gtk_type_class (gtk_menu_item_get_type ());
-
-  check_menu_item_signals[TOGGLED] =
-    gtk_signal_new ("toggled",
-                    GTK_RUN_FIRST,
-                    object_class->type,
-                    GTK_SIGNAL_OFFSET (GtkCheckMenuItemClass, toggled),
-                    gtk_signal_default_marshaller,
-                   GTK_TYPE_NONE, 0);
-
-  gtk_object_class_add_signals (object_class, check_menu_item_signals, LAST_SIGNAL);
-
-  widget_class->draw = gtk_check_menu_item_draw;
-  widget_class->expose_event = gtk_check_menu_item_expose;
-
-  menu_item_class->activate = gtk_check_menu_item_activate;
-  menu_item_class->toggle_size = 12;
-
-  klass->toggled = NULL;
-  klass->draw_indicator = gtk_real_check_menu_item_draw_indicator;
+  gtk_signal_emit (GTK_OBJECT (check_menu_item), check_menu_item_signals[TOGGLED]);
 }
 
 static void
 gtk_check_menu_item_init (GtkCheckMenuItem *check_menu_item)
 {
   check_menu_item->active = FALSE;
+  check_menu_item->always_show_toggle = FALSE;
 }
 
 static void
@@ -228,22 +252,29 @@ gtk_real_check_menu_item_draw_indicator (GtkCheckMenuItem *check_menu_item,
           widget->style->klass->xthickness + 2);
       y = (widget->allocation.height - height) / 2;
 
-      gdk_window_clear_area (widget->window, x, y, width, height);
-
       if (check_menu_item->active ||
+         check_menu_item->always_show_toggle ||
          (GTK_WIDGET_STATE (check_menu_item) == GTK_STATE_PRELIGHT))
        {
          state_type = GTK_WIDGET_STATE (widget);
-
-         shadow_type = GTK_SHADOW_IN;
-         if (check_menu_item->active && (state_type == GTK_STATE_PRELIGHT))
-           shadow_type = GTK_SHADOW_OUT;
-
-         gdk_draw_rectangle (widget->window,
-                             widget->style->bg_gc[state_type],
-                             TRUE, x, y, width, height);
-         gtk_draw_shadow (widget->style, widget->window,
+         
+         if (check_menu_item->always_show_toggle)
+           {
+             shadow_type = GTK_SHADOW_OUT;
+             if (check_menu_item->active)
+               shadow_type = GTK_SHADOW_IN;
+           }
+         else
+           {
+             shadow_type = GTK_SHADOW_IN;
+             if (check_menu_item->active &&
+                 (state_type == GTK_STATE_PRELIGHT))
+               shadow_type = GTK_SHADOW_OUT;
+           }
+         
+         gtk_paint_check (widget->style, widget->window,
                           state_type, shadow_type,
+                          area, widget, "check",
                           x, y, width, height);
        }
     }