* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
*/
+#define GTK_MENU_INTERNALS
+
#include <string.h>
#include "gtkaccellabel.h"
#include "gtkmain.h"
#include "gtkmenu.h"
#include "gtkmenubar.h"
#include "gtkmenuitem.h"
-#include "gtktearoffmenuitem.h"
#include "gtkseparatormenuitem.h"
-#include "gtksignal.h"
#define BORDER_SPACING 3
-#define SELECT_TIMEOUT 75
#define MENU_ITEM_CLASS(w) GTK_MENU_ITEM_CLASS (GTK_OBJECT (w)->klass)
GdkRectangle *area);
static gint gtk_menu_item_expose (GtkWidget *widget,
GdkEventExpose *event);
+static void gtk_menu_item_parent_set (GtkWidget *widget,
+ GtkWidget *previous_parent);
static void gtk_real_menu_item_select (GtkItem *item);
static GtkItemClass *parent_class;
static guint menu_item_signals[LAST_SIGNAL] = { 0 };
-static guint32 last_submenu_deselect_time = 0;
-
-
-GtkType
+GType
gtk_menu_item_get_type (void)
{
- static GtkType menu_item_type = 0;
+ static GType menu_item_type = 0;
if (!menu_item_type)
{
(GInstanceInitFunc) gtk_menu_item_init,
};
- menu_item_type = g_type_register_static (GTK_TYPE_ITEM, "GtkMenuItem", &menu_item_info, 0);
+ menu_item_type = g_type_register_static (GTK_TYPE_ITEM, "GtkMenuItem",
+ &menu_item_info, 0);
}
return menu_item_type;
widget_class->show_all = gtk_menu_item_show_all;
widget_class->hide_all = gtk_menu_item_hide_all;
widget_class->mnemonic_activate = gtk_menu_item_mnemonic_activate;
+ widget_class->parent_set = gtk_menu_item_parent_set;
container_class->forall = gtk_menu_item_forall;
klass->hide_on_activate = TRUE;
menu_item_signals[ACTIVATE] =
- gtk_signal_new ("activate",
- GTK_RUN_FIRST | GTK_RUN_ACTION,
- GTK_CLASS_TYPE (object_class),
- GTK_SIGNAL_OFFSET (GtkMenuItemClass, activate),
- _gtk_marshal_VOID__VOID,
- GTK_TYPE_NONE, 0);
+ g_signal_new ("activate",
+ G_OBJECT_CLASS_TYPE (gobject_class),
+ G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
+ G_STRUCT_OFFSET (GtkMenuItemClass, activate),
+ NULL, NULL,
+ _gtk_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
widget_class->activate_signal = menu_item_signals[ACTIVATE];
menu_item_signals[ACTIVATE_ITEM] =
- gtk_signal_new ("activate_item",
- GTK_RUN_FIRST,
- GTK_CLASS_TYPE (object_class),
- GTK_SIGNAL_OFFSET (GtkMenuItemClass, activate_item),
- gtk_signal_default_marshaller,
- GTK_TYPE_NONE, 0);
+ g_signal_new ("activate_item",
+ G_OBJECT_CLASS_TYPE (gobject_class),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (GtkMenuItemClass, activate_item),
+ NULL, NULL,
+ _gtk_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
menu_item_signals[TOGGLE_SIZE_REQUEST] =
- gtk_signal_new ("toggle_size_request",
- GTK_RUN_FIRST,
- GTK_CLASS_TYPE (object_class),
- GTK_SIGNAL_OFFSET (GtkMenuItemClass, toggle_size_request),
- _gtk_marshal_VOID__POINTER,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_POINTER);
+ g_signal_new ("toggle_size_request",
+ G_OBJECT_CLASS_TYPE (gobject_class),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (GtkMenuItemClass, toggle_size_request),
+ NULL, NULL,
+ _gtk_marshal_VOID__POINTER,
+ G_TYPE_NONE, 1,
+ G_TYPE_POINTER);
menu_item_signals[TOGGLE_SIZE_ALLOCATE] =
- gtk_signal_new ("toggle_size_allocate",
- GTK_RUN_FIRST,
- GTK_CLASS_TYPE (object_class),
- GTK_SIGNAL_OFFSET (GtkMenuItemClass, toggle_size_allocate),
- _gtk_marshal_NONE__INT,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_INT);
+ g_signal_new ("toggle_size_allocate",
+ G_OBJECT_CLASS_TYPE (gobject_class),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (GtkMenuItemClass, toggle_size_allocate),
+ NULL, NULL,
+ _gtk_marshal_NONE__INT,
+ G_TYPE_NONE, 1,
+ G_TYPE_INT);
+
+ gtk_widget_class_install_style_property_parser (widget_class,
+ g_param_spec_enum ("selected_shadow_type",
+ "Selected Shadow Type",
+ "Shadow type when item is selected",
+ GTK_TYPE_SHADOW_TYPE,
+ GTK_SHADOW_NONE,
+ G_PARAM_READABLE),
+ gtk_rc_property_parse_enum);
}
static void
menu_item->toggle_size = 0;
menu_item->accelerator_width = 0;
menu_item->show_submenu_indicator = FALSE;
- menu_item->submenu_direction = GTK_DIRECTION_RIGHT;
+ if (gtk_widget_get_direction (GTK_WIDGET (menu_item)) == GTK_TEXT_DIR_RTL)
+ menu_item->submenu_direction = GTK_DIRECTION_LEFT;
+ else
+ menu_item->submenu_direction = GTK_DIRECTION_RIGHT;
menu_item->submenu_placement = GTK_TOP_BOTTOM;
menu_item->right_justify = FALSE;
GtkWidget*
gtk_menu_item_new (void)
{
- return GTK_WIDGET (gtk_type_new (gtk_menu_item_get_type ()));
+ return g_object_new (GTK_TYPE_MENU_ITEM, NULL);
}
GtkWidget*
GtkWidget *accel_label;
menu_item = gtk_menu_item_new ();
- accel_label = gtk_type_new (GTK_TYPE_ACCEL_LABEL);
+ accel_label = g_object_new (GTK_TYPE_ACCEL_LABEL, NULL);
gtk_label_set_text_with_mnemonic (GTK_LABEL (accel_label), label);
gtk_misc_set_alignment (GTK_MISC (accel_label), 0.0, 0.5);
gtk_menu_detach (GTK_MENU (menu_item->submenu));
}
+void _gtk_menu_item_set_placement (GtkMenuItem *menu_item,
+ GtkSubmenuPlacement placement);
+
void
_gtk_menu_item_set_placement (GtkMenuItem *menu_item,
GtkSubmenuPlacement placement)
{
g_return_if_fail (GTK_IS_MENU_ITEM (menu_item));
- gtk_signal_emit (GTK_OBJECT (menu_item), menu_item_signals[ACTIVATE]);
+ g_signal_emit (menu_item, menu_item_signals[ACTIVATE], 0);
}
void
{
g_return_if_fail (GTK_IS_MENU_ITEM (menu_item));
- gtk_signal_emit (GTK_OBJECT (menu_item), menu_item_signals[TOGGLE_SIZE_REQUEST], requisition);
+ g_signal_emit (menu_item, menu_item_signals[TOGGLE_SIZE_REQUEST], 0, requisition);
}
void
{
g_return_if_fail (GTK_IS_MENU_ITEM (menu_item));
- gtk_signal_emit (GTK_OBJECT (menu_item), menu_item_signals[TOGGLE_SIZE_ALLOCATE], allocation);
+ g_signal_emit (menu_item, menu_item_signals[TOGGLE_SIZE_ALLOCATE], 0, allocation);
}
static void
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),
GtkMenuItem *menu_item;
GtkBin *bin;
GtkAllocation child_allocation;
+ GtkTextDirection direction;
g_return_if_fail (GTK_IS_MENU_ITEM (widget));
g_return_if_fail (allocation != NULL);
menu_item = GTK_MENU_ITEM (widget);
bin = GTK_BIN (widget);
+ direction = gtk_widget_get_direction (widget);
+
widget->allocation = *allocation;
if (bin->child)
{
+ GtkRequisition child_requisition;
+
child_allocation.x = (GTK_CONTAINER (widget)->border_width +
widget->style->xthickness +
BORDER_SPACING);
widget->style->ythickness);
child_allocation.width = MAX (1, (gint)allocation->width - child_allocation.x * 2);
child_allocation.height = MAX (1, (gint)allocation->height - child_allocation.y * 2);
- child_allocation.x += GTK_MENU_ITEM (widget)->toggle_size;
+ if (direction == GTK_TEXT_DIR_LTR)
+ child_allocation.x += GTK_MENU_ITEM (widget)->toggle_size;
child_allocation.width -= GTK_MENU_ITEM (widget)->toggle_size;
child_allocation.x += widget->allocation.x;
child_allocation.y += widget->allocation.y;
+
+ gtk_widget_get_child_requisition (bin->child, &child_requisition);
+ if (menu_item->submenu && menu_item->show_submenu_indicator)
+ {
+ if (direction == GTK_TEXT_DIR_RTL)
+ child_allocation.x += child_requisition.height;
+ child_allocation.width -= child_requisition.height;
+ }
- if (menu_item->submenu && menu_item->show_submenu_indicator)
- child_allocation.width -= 21;
-
+ if (child_allocation.width < 1)
+ child_allocation.width = 1;
+
gtk_widget_size_allocate (bin->child, &child_allocation);
}
GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
widget->window = gtk_widget_get_parent_window (widget);
- gdk_window_ref (widget->window);
+ g_object_ref (widget->window);
attributes.x = widget->allocation.x;
attributes.y = widget->allocation.y;
{
GtkMenuItem *menu_item = GTK_MENU_ITEM (widget);
- gdk_window_show (menu_item->event_window);
-
GTK_WIDGET_CLASS (parent_class)->map (widget);
+
+ gdk_window_show (menu_item->event_window);
}
static void
{
GtkMenuItem *menu_item;
GtkStateType state_type;
- GtkShadowType shadow_type;
+ GtkShadowType shadow_type, selected_shadow_type;
gint width, height;
gint x, y;
gint border_width = GTK_CONTAINER (widget)->border_width;
menu_item = GTK_MENU_ITEM (widget);
state_type = widget->state;
-
+
x = widget->allocation.x + border_width;
y = widget->allocation.y + border_width;
width = widget->allocation.width - border_width * 2;
if ((state_type == GTK_STATE_PRELIGHT) &&
(GTK_BIN (menu_item)->child))
- gtk_paint_box (widget->style,
- widget->window,
- GTK_STATE_PRELIGHT,
- GTK_SHADOW_OUT,
- area, widget, "menuitem",
- x, y, width, height);
-
+ {
+ gtk_widget_style_get (widget,
+ "selected_shadow_type", &selected_shadow_type,
+ NULL);
+ gtk_paint_box (widget->style,
+ widget->window,
+ GTK_STATE_PRELIGHT,
+ selected_shadow_type,
+ area, widget, "menuitem",
+ x, y, width, height);
+ }
+
if (menu_item->submenu && menu_item->show_submenu_indicator)
{
+ GtkRequisition child_requisition;
+ gint arrow_x, arrow_y;
+ gint arrow_size;
+ gint arrow_extent;
+ GtkTextDirection direction;
+ GtkArrowType arrow_type;
+
+ direction = gtk_widget_get_direction (widget);
+
+ gtk_widget_get_child_requisition (GTK_BIN (menu_item)->child,
+ &child_requisition);
+
+ arrow_size = child_requisition.height - 2 * widget->style->ythickness;
+ arrow_extent = arrow_size * 0.6;
+
shadow_type = GTK_SHADOW_OUT;
if (state_type == GTK_STATE_PRELIGHT)
shadow_type = GTK_SHADOW_IN;
+ if (direction == GTK_TEXT_DIR_LTR) {
+ arrow_x = x + width - 1 - arrow_size + (arrow_size - arrow_extent) / 2;
+ arrow_type = GTK_ARROW_RIGHT;
+ }
+ else {
+ arrow_x = x + 1 + (arrow_size - arrow_extent) / 2;
+ arrow_type = GTK_ARROW_LEFT;
+ }
+
+ 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_type, TRUE,
+ 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);
}
}
}
return FALSE;
}
+static gint
+get_popup_delay (GtkMenuItem *menu_item)
+{
+ GtkWidget *parent = GTK_WIDGET (menu_item)->parent;
+
+ if (GTK_IS_MENU_SHELL (parent))
+ {
+ return _gtk_menu_shell_get_popup_delay (GTK_MENU_SHELL (parent));
+ }
+ else
+ {
+ gint popup_delay;
+
+ g_object_get (G_OBJECT (gtk_widget_get_settings (GTK_WIDGET (menu_item))),
+ "gtk-menu-popup-delay", &popup_delay,
+ NULL);
+
+ return popup_delay;
+ }
+}
+
static void
gtk_real_menu_item_select (GtkItem *item)
{
menu_item = GTK_MENU_ITEM (item);
- /* if (menu_item->submenu && !GTK_WIDGET_VISIBLE (menu_item->submenu))*/
if (menu_item->submenu)
{
- guint32 etime;
- GdkEvent *event = gtk_get_current_event ();
-
- etime = event ? gdk_event_get_time (event) : GDK_CURRENT_TIME;
- if (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);
+ gint popup_delay;
+
+ if (menu_item->timer)
+ gtk_timeout_remove (menu_item->timer);
+
+ popup_delay = get_popup_delay (menu_item);
+
+ if (popup_delay > 0)
+ {
+ GdkEvent *event = gtk_get_current_event ();
+
+ menu_item->timer = gtk_timeout_add (popup_delay,
+ 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;
+
+ if (event)
+ gdk_event_free (event);
+ }
else
gtk_menu_item_popup_submenu (menu_item);
- if (event)
- gdk_event_free(event);
}
gtk_widget_set_state (GTK_WIDGET (menu_item), GTK_STATE_PRELIGHT);
- gtk_widget_draw (GTK_WIDGET (menu_item), NULL);
+ gtk_widget_queue_draw (GTK_WIDGET (menu_item));
}
static void
if (menu_item->submenu)
{
- guint32 etime;
- GdkEvent *event = gtk_get_current_event ();
-
if (menu_item->timer)
{
gtk_timeout_remove (menu_item->timer);
}
else
gtk_menu_popdown (GTK_MENU (menu_item->submenu));
-
- etime = event ? gdk_event_get_time (event) : GDK_CURRENT_TIME;
- if (etime > last_submenu_deselect_time)
- last_submenu_deselect_time = etime;
- if (event)
- gdk_event_free(event);
}
gtk_widget_set_state (GTK_WIDGET (menu_item), GTK_STATE_NORMAL);
- gtk_widget_draw (GTK_WIDGET (menu_item), NULL);
+ gtk_widget_queue_draw (GTK_WIDGET (menu_item));
}
static gboolean
}
else
- gtk_signal_emit (GTK_OBJECT (widget), menu_item_signals[ACTIVATE_ITEM]);
+ g_signal_emit (widget, menu_item_signals[ACTIVATE_ITEM], 0);
return TRUE;
}
{
GtkMenuShell *menu_shell = GTK_MENU_SHELL (widget->parent);
- if (!menu_shell->active)
- {
- gtk_grab_add (GTK_WIDGET (menu_shell));
- menu_shell->have_grab = TRUE;
- menu_shell->active = TRUE;
- }
+ _gtk_menu_shell_activate (menu_shell);
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), FALSE);
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 ();
static void
gtk_menu_item_popup_submenu (gpointer data)
{
+ GtkWidget *widget;
GtkMenuItem *menu_item;
- menu_item = GTK_MENU_ITEM (data);
+ widget = GTK_WIDGET (data);
+ menu_item = GTK_MENU_ITEM (widget);
+
+ if (menu_item->timer)
+ gtk_timeout_remove (menu_item->timer);
menu_item->timer = 0;
if (GTK_WIDGET_IS_SENSITIVE (menu_item->submenu))
- {
- gtk_menu_popup (GTK_MENU (menu_item->submenu),
- GTK_WIDGET (menu_item)->parent,
- GTK_WIDGET (menu_item),
- gtk_menu_item_position_menu,
- menu_item,
- GTK_MENU_SHELL (GTK_WIDGET (menu_item)->parent)->button,
- 0);
- }
+ gtk_menu_popup (GTK_MENU (menu_item->submenu),
+ widget->parent,
+ widget,
+ gtk_menu_item_position_menu,
+ menu_item,
+ GTK_MENU_SHELL (widget->parent)->button,
+ 0);
}
static void
GtkMenuItem *menu_item;
GtkWidget *widget;
GtkWidget *parent_menu_item;
+ GdkScreen *screen;
gint screen_width;
gint screen_height;
gint twidth, theight;
gint tx, ty;
+ GtkTextDirection direction;
g_return_if_fail (menu != NULL);
g_return_if_fail (x != NULL);
menu_item = GTK_MENU_ITEM (user_data);
widget = GTK_WIDGET (user_data);
+ direction = gtk_widget_get_direction (widget);
+
twidth = GTK_WIDGET (menu)->requisition.width;
theight = GTK_WIDGET (menu)->requisition.height;
- screen_width = gdk_screen_width ();
- screen_height = gdk_screen_height ();
+ screen = gtk_widget_get_screen (widget);
+ screen_width = gdk_screen_get_width (screen);
+ screen_height = gdk_screen_get_height (screen);
if (!gdk_window_get_origin (widget->window, &tx, &ty))
{
switch (menu_item->submenu_placement)
{
case GTK_TOP_BOTTOM:
+ if (direction == GTK_TEXT_DIR_LTR)
+ menu_item->submenu_direction = GTK_DIRECTION_RIGHT;
+ else
+ {
+ menu_item->submenu_direction = GTK_DIRECTION_LEFT;
+ tx += widget->allocation.width - twidth;
+ }
+
if ((ty + widget->allocation.height + theight) <= screen_height)
ty += widget->allocation.height;
else if ((ty - theight) >= 0)
break;
case GTK_LEFT_RIGHT:
- menu_item->submenu_direction = GTK_DIRECTION_RIGHT;
parent_menu_item = GTK_MENU (widget->parent)->parent_menu_item;
- if (parent_menu_item)
+ if (parent_menu_item &&
+ !GTK_MENU (widget->parent)->torn_off &&
+ !GTK_MENU_SHELL (menu)->active)
menu_item->submenu_direction = GTK_MENU_ITEM (parent_menu_item)->submenu_direction;
+ else if (direction == GTK_TEXT_DIR_LTR)
+ menu_item->submenu_direction = GTK_DIRECTION_RIGHT;
+ else
+ menu_item->submenu_direction = GTK_DIRECTION_LEFT;
switch (menu_item->submenu_direction)
{
}
}
+static void
+gtk_menu_item_parent_set (GtkWidget *widget,
+ GtkWidget *previous_parent)
+{
+ GtkMenuItem *menu_item = GTK_MENU_ITEM (widget);
+ GtkMenu *menu = GTK_IS_MENU (widget->parent) ? GTK_MENU (widget->parent) : NULL;
+
+ if (menu)
+ _gtk_menu_item_refresh_accel_path (menu_item,
+ menu->accel_path,
+ menu->accel_group,
+ TRUE);
+
+ if (GTK_WIDGET_CLASS (parent_class)->parent_set)
+ GTK_WIDGET_CLASS (parent_class)->parent_set (widget, previous_parent);
+}
+
void
_gtk_menu_item_refresh_accel_path (GtkMenuItem *menu_item,
const gchar *prefix,
GtkWidget *widget;
g_return_if_fail (GTK_IS_MENU_ITEM (menu_item));
- g_return_if_fail (GTK_IS_ACCEL_GROUP (accel_group));
+ g_return_if_fail (!accel_group || GTK_IS_ACCEL_GROUP (accel_group));
widget = GTK_WIDGET (menu_item);
- path = _gtk_widget_get_accel_path (widget);
+ if (!accel_group)
+ {
+ gtk_widget_set_accel_path (widget, NULL, NULL);
+ return;
+ }
+
+ path = _gtk_widget_get_accel_path (widget, NULL);
if (!path) /* no active accel_path yet */
{
path = menu_item->accel_path;
path = menu_item->accel_path;
}
if (path)
- _gtk_widget_set_accel_path (widget, path, accel_group);
+ gtk_widget_set_accel_path (widget, path, accel_group);
}
else if (group_changed) /* reinstall accelerators */
- _gtk_widget_set_accel_path (widget, path, accel_group);
+ gtk_widget_set_accel_path (widget, path, accel_group);
}
/**
* gtk_menu_item_set_accel_path
* @menu_item: a valid #GtkMenuItem
- * @accel_path: accelerator path, corresponding to this menu item's funcitonality
+ * @accel_path: accelerator path, corresponding to this menu item's
+ * functionality, or %NULL to unset the current path.
*
* Set the accelerator path on @menu_item, through which runtime changes of the
* menu item's accelerator caused by the user can be identified and saved to
* gtk_accel_map_add_entry() with the same @accel_path.
* See also gtk_accel_map_add_entry() on the specifics of accelerator paths,
* and gtk_menu_set_accel_path() for a more convenient variant of this function.
+ *
+ * This function is basically a convenience wrapper that handles calling
+ * gtk_widget_set_accel_path() with the appropriate accelerator group for
+ * the menu item.
+ *
+ * Note that you do need to set an accelerator on the parent menu with
+ * gtk_menu_set_accel_group() for this to work.
*/
void
gtk_menu_item_set_accel_path (GtkMenuItem *menu_item,
GtkWidget *widget;
g_return_if_fail (GTK_IS_MENU_ITEM (menu_item));
- g_return_if_fail (accel_path && accel_path[0] == '<' && strchr (accel_path, '/'));
+ g_return_if_fail (accel_path == NULL ||
+ (accel_path[0] == '<' && strchr (accel_path, '/')));
widget = GTK_WIDGET (menu_item);
menu_item->accel_path = g_strdup (accel_path);
/* forget accelerators associated with old path */
- _gtk_widget_set_accel_path (widget, NULL, NULL);
+ 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);