#include "gtkmenu.h"
#include "gtkmenubar.h"
#include "gtkmenuitem.h"
-#include "gtktearoffmenuitem.h"
#include "gtkseparatormenuitem.h"
#include "gtksignal.h"
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),
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);
}
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);
}
}
}
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)
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);
- }
}
}
}
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 ();
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);