]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkmenuitem.c
Update version to 2.0.0
[~andy/gtk] / gtk / gtkmenuitem.c
index 083358e989c8b72b1eb5da02a75f530f77601c40..2735a5c141f61105c52a70ab47e622593701e9e8 100644 (file)
@@ -33,7 +33,6 @@
 #include "gtkmenu.h"
 #include "gtkmenubar.h"
 #include "gtkmenuitem.h"
-#include "gtktearoffmenuitem.h"
 #include "gtkseparatormenuitem.h"
 #include "gtksignal.h"
 
@@ -459,10 +458,10 @@ gtk_menu_item_size_request (GtkWidget      *widget,
 
       requisition->width += child_requisition.width;
       requisition->height += child_requisition.height;
-    }
 
-  if (menu_item->submenu && menu_item->show_submenu_indicator)
-    requisition->width += 21;
+      if (menu_item->submenu && menu_item->show_submenu_indicator)
+       requisition->width += child_requisition.height;
+    }
 
   accel_width = 0;
   gtk_container_foreach (GTK_CONTAINER (menu_item),
@@ -502,8 +501,8 @@ gtk_menu_item_size_allocate (GtkWidget     *widget,
       child_allocation.y += widget->allocation.y;
       
       if (menu_item->submenu && menu_item->show_submenu_indicator)
-       child_allocation.width -= 21;
-      
+       child_allocation.width -= child_allocation.height;
+
       gtk_widget_size_allocate (bin->child, &child_allocation);
     }
 
@@ -615,22 +614,30 @@ gtk_menu_item_paint (GtkWidget    *widget,
 
       if (menu_item->submenu && menu_item->show_submenu_indicator)
        {
+         gint arrow_x, arrow_y;
+         gint arrow_size = height - 2 * widget->style->ythickness;
+         gint arrow_extent = arrow_size / 2;
+         
          shadow_type = GTK_SHADOW_OUT;
          if (state_type == GTK_STATE_PRELIGHT)
            shadow_type = GTK_SHADOW_IN;
 
+         arrow_x = x + width - 1 - arrow_size + (arrow_size - arrow_extent) / 2;
+         arrow_y = y + (height - arrow_extent) / 2;
+
          gtk_paint_arrow (widget->style, widget->window,
                           state_type, shadow_type, 
                           area, widget, "menuitem", 
                           GTK_ARROW_RIGHT, TRUE,
-                          x + width - 15, y + height / 2 - 5, 10, 10);
+                          arrow_x, arrow_y,
+                          arrow_extent, arrow_extent);
        }
       else if (!GTK_BIN (menu_item)->child)
        {
-          gtk_paint_hline (widget->style, widget->window, GTK_STATE_NORMAL,
-                           area, widget, "menuitem",
-                           widget->allocation.x, widget->allocation.width,
-                           widget->allocation.y);
+         gtk_paint_hline (widget->style, widget->window, GTK_STATE_NORMAL,
+                          area, widget, "menuitem",
+                          widget->allocation.x, widget->allocation.width,
+                          widget->allocation.y);
        }
     }
 }
@@ -668,11 +675,21 @@ gtk_real_menu_item_select (GtkItem *item)
       GdkEvent *event = gtk_get_current_event ();
 
       etime = event ? gdk_event_get_time (event) : GDK_CURRENT_TIME;
-      if (etime >= last_submenu_deselect_time &&
+      if (event &&
+         etime >= last_submenu_deselect_time &&
          last_submenu_deselect_time + SELECT_TIMEOUT > etime)
-       menu_item->timer = gtk_timeout_add (SELECT_TIMEOUT - (etime - last_submenu_deselect_time),
-                                           gtk_menu_item_select_timeout,
-                                           menu_item);
+       {
+         if (!menu_item->timer)
+           menu_item->timer = gtk_timeout_add (SELECT_TIMEOUT - (etime - last_submenu_deselect_time),
+                                               gtk_menu_item_select_timeout,
+                                               menu_item);
+         if (event &&
+             event->type != GDK_BUTTON_PRESS &&
+             event->type != GDK_ENTER_NOTIFY)
+           menu_item->timer_from_keypress = TRUE;
+         else
+           menu_item->timer_from_keypress = FALSE;
+       }
       else
        gtk_menu_item_popup_submenu (menu_item);
       if (event)
@@ -765,15 +782,8 @@ gtk_real_menu_item_activate_item (GtkMenuItem *menu_item)
          gtk_menu_shell_select_item (GTK_MENU_SHELL (widget->parent), widget); 
          gtk_menu_item_popup_submenu (widget); 
 
+         _gtk_menu_shell_select_first (GTK_MENU_SHELL (menu_item->submenu));
          submenu = GTK_MENU_SHELL (menu_item->submenu);
-         if (submenu->children)
-           {
-             if (submenu->children->next &&
-                 GTK_IS_TEAROFF_MENU_ITEM (submenu->children->data))
-               gtk_menu_shell_select_item (submenu, submenu->children->next->data);
-             else
-               gtk_menu_shell_select_item (submenu, submenu->children->data);
-           }
        }
     }
 }
@@ -798,9 +808,21 @@ gtk_real_menu_item_toggle_size_allocate (GtkMenuItem *menu_item,
 static gint
 gtk_menu_item_select_timeout (gpointer data)
 {
+  GtkMenuItem *menu_item;
+  GtkWidget *parent;
+  
   GDK_THREADS_ENTER ();
 
-  gtk_menu_item_popup_submenu (data);
+  menu_item = GTK_MENU_ITEM (data);
+
+  parent = GTK_WIDGET (menu_item)->parent;
+
+  if (parent && GTK_IS_MENU_SHELL (parent) && GTK_MENU_SHELL (parent)->active)
+    {
+      gtk_menu_item_popup_submenu (data);
+      if (menu_item->timer_from_keypress && menu_item->submenu)
+       GTK_MENU_SHELL (menu_item->submenu)->ignore_enter = TRUE;
+    }
 
   GDK_THREADS_LEAVE ();
 
@@ -1116,7 +1138,7 @@ gtk_menu_item_set_accel_path (GtkMenuItem *menu_item,
   gtk_widget_set_accel_path (widget, NULL, NULL);
 
   /* install accelerators associated with new path */
-  if (widget->parent)
+  if (widget->parent && GTK_IS_MENU (widget->parent))
     {
       GtkMenu *menu = GTK_MENU (widget->parent);