]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtktearoffmenuitem.c
Add GtkSpinner::animation-duration style property
[~andy/gtk] / gtk / gtktearoffmenuitem.c
index 1a2609eefa86d96ef9f4952263a12b49ded9b6ae..f6615206e110c60338d7aaf0865a1a0d24f0731d 100644 (file)
  * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
  */
 
+#include "config.h"
+
 #include "gtkmenu.h"
 #include "gtktearoffmenuitem.h"
+#include "gtkintl.h"
+#include "gtkalias.h"
 
 #define ARROW_SIZE 10
 #define TEAR_LENGTH 5
 #define BORDER_SPACING  3
 
-static void gtk_tearoff_menu_item_class_init (GtkTearoffMenuItemClass *klass);
-static void gtk_tearoff_menu_item_init       (GtkTearoffMenuItem      *tearoff_menu_item);
 static void gtk_tearoff_menu_item_size_request (GtkWidget             *widget,
                                                GtkRequisition        *requisition);
 static gint gtk_tearoff_menu_item_expose     (GtkWidget             *widget,
                                              GdkEventExpose        *event);
 static void gtk_tearoff_menu_item_activate   (GtkMenuItem           *menu_item);
-static gint gtk_tearoff_menu_item_delete_cb  (GtkMenuItem           *menu_item,
-                                             GdkEventAny           *event);
-
-GType
-gtk_tearoff_menu_item_get_type (void)
-{
-  static GType tearoff_menu_item_type = 0;
+static void gtk_tearoff_menu_item_parent_set (GtkWidget             *widget,
+                                             GtkWidget             *previous);
 
-  if (!tearoff_menu_item_type)
-    {
-      static const GTypeInfo tearoff_menu_item_info =
-      {
-        sizeof (GtkTearoffMenuItemClass),
-       NULL,           /* base_init */
-       NULL,           /* base_finalize */
-       (GClassInitFunc) gtk_tearoff_menu_item_class_init,
-       NULL,           /* class_finalize */
-       NULL,           /* class_data */
-       sizeof (GtkTearoffMenuItem),
-       0,              /* n_preallocs */
-       (GInstanceInitFunc) gtk_tearoff_menu_item_init,
-      };
-
-      tearoff_menu_item_type =
-       g_type_register_static (GTK_TYPE_MENU_ITEM, "GtkTearoffMenuItem",
-                               &tearoff_menu_item_info, 0);
-    }
-
-  return tearoff_menu_item_type;
-}
+G_DEFINE_TYPE (GtkTearoffMenuItem, gtk_tearoff_menu_item, GTK_TYPE_MENU_ITEM)
 
 GtkWidget*
 gtk_tearoff_menu_item_new (void)
@@ -78,16 +54,15 @@ gtk_tearoff_menu_item_new (void)
 static void
 gtk_tearoff_menu_item_class_init (GtkTearoffMenuItemClass *klass)
 {
-  GtkObjectClass *object_class;
   GtkWidgetClass *widget_class;
   GtkMenuItemClass *menu_item_class;
 
-  object_class = (GtkObjectClass*) klass;
   widget_class = (GtkWidgetClass*) klass;
   menu_item_class = (GtkMenuItemClass*) klass;
 
   widget_class->expose_event = gtk_tearoff_menu_item_expose;
   widget_class->size_request = gtk_tearoff_menu_item_size_request;
+  widget_class->parent_set = gtk_tearoff_menu_item_parent_set;
 
   menu_item_class->activate = gtk_tearoff_menu_item_activate;
 }
@@ -102,17 +77,13 @@ static void
 gtk_tearoff_menu_item_size_request (GtkWidget      *widget,
                                    GtkRequisition *requisition)
 {
-  GtkTearoffMenuItem *tearoff;
-
-  tearoff = GTK_TEAROFF_MENU_ITEM (widget);
-  
   requisition->width = (GTK_CONTAINER (widget)->border_width +
                        widget->style->xthickness +
                        BORDER_SPACING) * 2;
   requisition->height = (GTK_CONTAINER (widget)->border_width +
                         widget->style->ythickness) * 2;
 
-  if (tearoff->torn_off)
+  if (GTK_IS_MENU (widget->parent) && GTK_MENU (widget->parent)->torn_off)
     {
       requisition->height += ARROW_SIZE;
     }
@@ -127,7 +98,6 @@ gtk_tearoff_menu_item_paint (GtkWidget   *widget,
                             GdkRectangle *area)
 {
   GtkMenuItem *menu_item;
-  GtkTearoffMenuItem *tearoff_item;
   GtkShadowType shadow_type;
   gint width, height;
   gint x, y;
@@ -138,7 +108,6 @@ gtk_tearoff_menu_item_paint (GtkWidget   *widget,
   if (GTK_WIDGET_DRAWABLE (widget))
     {
       menu_item = GTK_MENU_ITEM (widget);
-      tearoff_item = GTK_TEAROFF_MENU_ITEM (widget);
 
       direction = gtk_widget_get_direction (widget);
 
@@ -153,7 +122,7 @@ gtk_tearoff_menu_item_paint (GtkWidget   *widget,
          gint selected_shadow_type;
          
          gtk_widget_style_get (widget,
-                               "selected_shadow_type", &selected_shadow_type,
+                               "selected-shadow-type", &selected_shadow_type,
                                NULL);
          gtk_paint_box (widget->style,
                         widget->window,
@@ -165,7 +134,7 @@ gtk_tearoff_menu_item_paint (GtkWidget   *widget,
       else
        gdk_window_clear_area (widget->window, area->x, area->y, area->width, area->height);
 
-      if (tearoff_item->torn_off)
+      if (GTK_IS_MENU (widget->parent) && GTK_MENU (widget->parent)->torn_off)
        {
          gint arrow_x;
 
@@ -238,36 +207,49 @@ gtk_tearoff_menu_item_expose (GtkWidget      *widget,
   return FALSE;
 }
 
-static gint
-gtk_tearoff_menu_item_delete_cb (GtkMenuItem *menu_item, GdkEventAny *event)
-{
-  gtk_tearoff_menu_item_activate (menu_item);
-  return TRUE;
-}
-
 static void
 gtk_tearoff_menu_item_activate (GtkMenuItem *menu_item)
 {
-  GtkTearoffMenuItem *tearoff_menu_item = GTK_TEAROFF_MENU_ITEM (menu_item);
-
-  tearoff_menu_item->torn_off = !tearoff_menu_item->torn_off;
-  gtk_widget_queue_resize (GTK_WIDGET (menu_item));
-
   if (GTK_IS_MENU (GTK_WIDGET (menu_item)->parent))
     {
       GtkMenu *menu = GTK_MENU (GTK_WIDGET (menu_item)->parent);
-      gboolean need_connect;
       
-       need_connect = (tearoff_menu_item->torn_off && !menu->tearoff_window);
+      gtk_widget_queue_resize (GTK_WIDGET (menu_item));
+      gtk_menu_set_tearoff_state (GTK_MENU (GTK_WIDGET (menu_item)->parent),
+                                 !menu->torn_off);
+    }
+}
 
-       gtk_menu_set_tearoff_state (GTK_MENU (GTK_WIDGET (menu_item)->parent),
-                                   tearoff_menu_item->torn_off);
+static void
+tearoff_state_changed (GtkMenu            *menu,
+                      GParamSpec         *pspec,
+                      gpointer            data)
+{
+  GtkTearoffMenuItem *tearoff_menu_item = GTK_TEAROFF_MENU_ITEM (data);
 
-       if (need_connect)
-         g_signal_connect_swapped (menu->tearoff_window,
-                                   "delete_event",
-                                   G_CALLBACK (gtk_tearoff_menu_item_delete_cb),
-                                   menu_item);
-    }
+  tearoff_menu_item->torn_off = gtk_menu_get_tearoff_state (menu);
+}
+
+static void
+gtk_tearoff_menu_item_parent_set (GtkWidget *widget,
+                                 GtkWidget *previous)
+{
+  GtkTearoffMenuItem *tearoff_menu_item = GTK_TEAROFF_MENU_ITEM (widget);
+  GtkMenu *menu = GTK_IS_MENU (widget->parent) ? GTK_MENU (widget->parent) : NULL;
+
+  if (previous)
+    g_signal_handlers_disconnect_by_func (previous, 
+                                         tearoff_state_changed, 
+                                         tearoff_menu_item);
+  
+  if (menu)
+    {
+      tearoff_menu_item->torn_off = gtk_menu_get_tearoff_state (menu);
+      g_signal_connect (menu, "notify::tearoff-state", 
+                       G_CALLBACK (tearoff_state_changed), 
+                       tearoff_menu_item);
+    }  
 }
 
+#define __GTK_TEAROFF_MENU_ITEM_C__
+#include "gtkaliasdef.c"