diff --git a/ChangeLog b/ChangeLog index 2b7f0a1d3c..4dba5a61bc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2007-06-15 Matthias Clasen + + * gtk/gtkmenushell.[ch]: add move_selected signal to allow + overriding the default internal behaviour. (#446833, Ryan Lortie) + 2007-06-15 Mathias Hasselmann * gtk/gtkwidget.c: Forgot to free the unescaped tooltip text. diff --git a/gtk/gtkmenushell.c b/gtk/gtkmenushell.c index 250c0ac737..79422f9587 100644 --- a/gtk/gtkmenushell.c +++ b/gtk/gtkmenushell.c @@ -57,6 +57,7 @@ enum { ACTIVATE_CURRENT, CANCEL, CYCLE_FOCUS, + MOVE_SELECTED, LAST_SIGNAL }; @@ -193,6 +194,8 @@ static void gtk_real_menu_shell_cycle_focus (GtkMenuShell *menu_shell, static void gtk_menu_shell_reset_key_hash (GtkMenuShell *menu_shell); static gboolean gtk_menu_shell_activate_mnemonic (GtkMenuShell *menu_shell, GdkEventKey *event); +static gboolean gtk_menu_shell_real_move_selected (GtkMenuShell *menu_shell, + gint distance); static guint menu_shell_signals[LAST_SIGNAL] = { 0 }; @@ -237,6 +240,7 @@ gtk_menu_shell_class_init (GtkMenuShellClass *klass) klass->cancel = gtk_real_menu_shell_cancel; klass->select_item = gtk_menu_shell_real_select_item; klass->insert = gtk_menu_shell_real_insert; + klass->move_selected = gtk_menu_shell_real_move_selected; menu_shell_signals[DEACTIVATE] = g_signal_new (I_("deactivate"), @@ -289,7 +293,15 @@ gtk_menu_shell_class_init (GtkMenuShellClass *klass) _gtk_marshal_VOID__ENUM, G_TYPE_NONE, 1, GTK_TYPE_DIRECTION_TYPE); - + menu_shell_signals[MOVE_SELECTED] = + g_signal_new (I_("move_selected"), + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GtkMenuShellClass, move_selected), + _gtk_boolean_handled_accumulator, NULL, + _gtk_marshal_BOOLEAN__INT, + G_TYPE_BOOLEAN, 1, + G_TYPE_INT); binding_set = gtk_binding_set_by_class (klass); gtk_binding_entry_add_signal (binding_set, @@ -1132,9 +1144,9 @@ gtk_menu_shell_activate_item (GtkMenuShell *menu_shell, } /* Distance should be +/- 1 */ -static void -gtk_menu_shell_move_selected (GtkMenuShell *menu_shell, - gint distance) +static gboolean +gtk_menu_shell_real_move_selected (GtkMenuShell *menu_shell, + gint distance) { if (menu_shell->active_menu_item) { @@ -1185,6 +1197,19 @@ gtk_menu_shell_move_selected (GtkMenuShell *menu_shell, if (node) gtk_menu_shell_select_item (menu_shell, node->data); } + + return TRUE; +} + +/* Distance should be +/- 1 */ +static void +gtk_menu_shell_move_selected (GtkMenuShell *menu_shell, + gint distance) +{ + gboolean handled = FALSE; + + g_signal_emit (menu_shell, menu_shell_signals[MOVE_SELECTED], 0, + distance, &handled); } /** @@ -1261,6 +1286,9 @@ gtk_menu_shell_select_submenu_first (GtkMenuShell *menu_shell) { GtkMenuItem *menu_item; + if (menu_shell->active_menu_item == NULL) + return FALSE; + menu_item = GTK_MENU_ITEM (menu_shell->active_menu_item); if (menu_item->submenu) diff --git a/gtk/gtkmenushell.h b/gtk/gtkmenushell.h index 9a4b3a0147..2595a74ff0 100644 --- a/gtk/gtkmenushell.h +++ b/gtk/gtkmenushell.h @@ -84,11 +84,12 @@ struct _GtkMenuShellClass GtkWidget *child, gint position); gint (*get_popup_delay) (GtkMenuShell *menu_shell); + gboolean (*move_selected) (GtkMenuShell *menu_shell, + gint distance); /* Padding for future expansion */ void (*_gtk_reserved1) (void); void (*_gtk_reserved2) (void); - void (*_gtk_reserved3) (void); };