]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkitem.c
GtkWindow: Add gtk_window_has_group()
[~andy/gtk] / gtk / gtkitem.c
index 0afa4e3efac3b5823df0ee2dd0f6e9e641cd9207..b21c1e5fc1d09237fa9b3ba2aff657b997a83c69 100644 (file)
@@ -2,21 +2,33 @@
  * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
  *
  * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
+ * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2 of the License, or (at your option) any later version.
  *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
+ * Lesser 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.
+ * You should have received a copy of the GNU Lesser General Public
+ * 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-2000.  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 "config.h"
 #include "gtkitem.h"
-#include "gtksignal.h"
+#include "gtkmarshalers.h"
+#include "gtkintl.h"
+#include "gtkalias.h"
 
 
 enum {
@@ -27,136 +39,85 @@ enum {
 };
 
 
-static void gtk_item_class_init (GtkItemClass *klass);
-static void gtk_item_init       (GtkItem      *item);
-static void gtk_item_map        (GtkWidget    *widget);
-static void gtk_item_unmap      (GtkWidget    *widget);
-static void gtk_item_realize    (GtkWidget    *widget);
+static void gtk_item_realize    (GtkWidget        *widget);
+static gint gtk_item_enter      (GtkWidget        *widget,
+                                GdkEventCrossing *event);
+static gint gtk_item_leave      (GtkWidget        *widget,
+                                GdkEventCrossing *event);
 
 
-static gint item_signals[LAST_SIGNAL] = { 0 };
+static guint item_signals[LAST_SIGNAL] = { 0 };
 
-
-guint
-gtk_item_get_type ()
-{
-  static guint item_type = 0;
-
-  if (!item_type)
-    {
-      GtkTypeInfo item_info =
-      {
-       "GtkItem",
-       sizeof (GtkItem),
-       sizeof (GtkItemClass),
-       (GtkClassInitFunc) gtk_item_class_init,
-       (GtkObjectInitFunc) gtk_item_init,
-       (GtkArgSetFunc) NULL,
-        (GtkArgGetFunc) NULL,
-      };
-
-      item_type = gtk_type_unique (gtk_bin_get_type (), &item_info);
-    }
-
-  return item_type;
-}
+G_DEFINE_ABSTRACT_TYPE (GtkItem, gtk_item, GTK_TYPE_BIN)
 
 static void
 gtk_item_class_init (GtkItemClass *class)
 {
-  GtkObjectClass *object_class;
+  GObjectClass *object_class;
   GtkWidgetClass *widget_class;
 
-  object_class = (GtkObjectClass*) class;
+  object_class = (GObjectClass*) class;
   widget_class = (GtkWidgetClass*) class;
 
-  item_signals[SELECT] =
-    gtk_signal_new ("select",
-                    GTK_RUN_FIRST,
-                    object_class->type,
-                    GTK_SIGNAL_OFFSET (GtkItemClass, select),
-                    gtk_signal_default_marshaller,
-                   GTK_TYPE_NONE, 0);
-  item_signals[DESELECT] =
-    gtk_signal_new ("deselect",
-                    GTK_RUN_FIRST,
-                    object_class->type,
-                    GTK_SIGNAL_OFFSET (GtkItemClass, deselect),
-                    gtk_signal_default_marshaller,
-                   GTK_TYPE_NONE, 0);
-  item_signals[TOGGLE] =
-    gtk_signal_new ("toggle",
-                    GTK_RUN_FIRST,
-                    object_class->type,
-                    GTK_SIGNAL_OFFSET (GtkItemClass, toggle),
-                    gtk_signal_default_marshaller,
-                   GTK_TYPE_NONE, 0);
-
-  gtk_object_class_add_signals (object_class, item_signals, LAST_SIGNAL);
-
-  widget_class->activate_signal = item_signals[TOGGLE];
-  widget_class->map = gtk_item_map;
-  widget_class->unmap = gtk_item_unmap;
   widget_class->realize = gtk_item_realize;
+  widget_class->enter_notify_event = gtk_item_enter;
+  widget_class->leave_notify_event = gtk_item_leave;
 
   class->select = NULL;
   class->deselect = NULL;
   class->toggle = NULL;
+
+  item_signals[SELECT] =
+    g_signal_new (I_("select"),
+                 G_OBJECT_CLASS_TYPE (object_class),
+                 G_SIGNAL_RUN_FIRST,
+                 G_STRUCT_OFFSET (GtkItemClass, select),
+                 NULL, NULL,
+                 _gtk_marshal_VOID__VOID,
+                 G_TYPE_NONE, 0);
+  item_signals[DESELECT] =
+    g_signal_new (I_("deselect"),
+                 G_OBJECT_CLASS_TYPE (object_class),
+                 G_SIGNAL_RUN_FIRST,
+                 G_STRUCT_OFFSET (GtkItemClass, deselect),
+                 NULL, NULL,
+                 _gtk_marshal_VOID__VOID,
+                 G_TYPE_NONE, 0);
+  item_signals[TOGGLE] =
+    g_signal_new (I_("toggle"),
+                 G_OBJECT_CLASS_TYPE (object_class),
+                 G_SIGNAL_RUN_FIRST,
+                 G_STRUCT_OFFSET (GtkItemClass, toggle),
+                 NULL, NULL,
+                 _gtk_marshal_VOID__VOID,
+                 G_TYPE_NONE, 0);
+  widget_class->activate_signal = item_signals[TOGGLE];
 }
 
 static void
 gtk_item_init (GtkItem *item)
 {
-  GTK_WIDGET_UNSET_FLAGS (item, GTK_NO_WINDOW);
+  gtk_widget_set_has_window (GTK_WIDGET (item), TRUE);
 }
 
 void
 gtk_item_select (GtkItem *item)
 {
-  gtk_signal_emit (GTK_OBJECT (item), item_signals[SELECT]);
+  g_signal_emit (item, item_signals[SELECT], 0);
 }
 
 void
 gtk_item_deselect (GtkItem *item)
 {
-  gtk_signal_emit (GTK_OBJECT (item), item_signals[DESELECT]);
+  g_signal_emit (item, item_signals[DESELECT], 0);
 }
 
 void
 gtk_item_toggle (GtkItem *item)
 {
-  gtk_signal_emit (GTK_OBJECT (item), item_signals[TOGGLE]);
-}
-
-
-static void
-gtk_item_map (GtkWidget *widget)
-{
-  GtkBin *bin;
-
-  g_return_if_fail (widget != NULL);
-  g_return_if_fail (GTK_IS_ITEM (widget));
-
-  GTK_WIDGET_SET_FLAGS (widget, GTK_MAPPED);
-  gdk_window_show (widget->window);
-
-  bin = GTK_BIN (widget);
-
-  if (bin->child &&
-      GTK_WIDGET_VISIBLE (bin->child) &&
-      !GTK_WIDGET_MAPPED (bin->child))
-    gtk_widget_map (bin->child);
+  g_signal_emit (item, item_signals[TOGGLE], 0);
 }
 
-static void
-gtk_item_unmap (GtkWidget *widget)
-{
-  g_return_if_fail (widget != NULL);
-  g_return_if_fail (GTK_IS_ITEM (widget));
-
-  GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED);
-  gdk_window_hide (widget->window);
-}
 
 static void
 gtk_item_realize (GtkWidget *widget)
@@ -164,10 +125,7 @@ gtk_item_realize (GtkWidget *widget)
   GdkWindowAttr attributes;
   gint attributes_mask;
 
-  g_return_if_fail (widget != NULL);
-  g_return_if_fail (GTK_IS_ITEM (widget));
-
-  GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
+  gtk_widget_set_realized (widget, TRUE);
 
   attributes.x = widget->allocation.x;
   attributes.y = widget->allocation.y;
@@ -177,11 +135,13 @@ gtk_item_realize (GtkWidget *widget)
   attributes.wclass = GDK_INPUT_OUTPUT;
   attributes.visual = gtk_widget_get_visual (widget);
   attributes.colormap = gtk_widget_get_colormap (widget);
-  attributes.event_mask = (GDK_EXPOSURE_MASK |
+  attributes.event_mask = (gtk_widget_get_events (widget) |
+                          GDK_EXPOSURE_MASK |
                           GDK_BUTTON_PRESS_MASK |
                           GDK_BUTTON_RELEASE_MASK |
                           GDK_ENTER_NOTIFY_MASK |
-                          GDK_LEAVE_NOTIFY_MASK);
+                          GDK_LEAVE_NOTIFY_MASK |
+                          GDK_POINTER_MOTION_MASK);
 
   attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
   widget->window = gdk_window_new (gtk_widget_get_parent_window (widget), &attributes, attributes_mask);
@@ -189,4 +149,28 @@ gtk_item_realize (GtkWidget *widget)
 
   widget->style = gtk_style_attach (widget->style, widget->window);
   gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL);
+  gdk_window_set_back_pixmap (widget->window, NULL, TRUE);
+}
+
+static gint
+gtk_item_enter (GtkWidget        *widget,
+               GdkEventCrossing *event)
+{
+  g_return_val_if_fail (GTK_IS_ITEM (widget), FALSE);
+  g_return_val_if_fail (event != NULL, FALSE);
+
+  return gtk_widget_event (widget->parent, (GdkEvent*) event);
 }
+
+static gint
+gtk_item_leave (GtkWidget        *widget,
+               GdkEventCrossing *event)
+{
+  g_return_val_if_fail (GTK_IS_ITEM (widget), FALSE);
+  g_return_val_if_fail (event != NULL, FALSE);
+
+  return gtk_widget_event (widget->parent, (GdkEvent*) event);
+}
+
+#define __GTK_ITEM_C__
+#include "gtkaliasdef.c"