diff -r -u -p /data/zzz/gtk-2.6/gtk+-2.6.10/gtk/widget/gtkwidget.c gtk/widget/gtkwidget.c --- /data/zzz/gtk-2.6/gtk+-2.6.10/gtk/widget/gtkwidget.c 2006-05-30 13:57:49.732943065 +0800 +++ gtk/gtkwidget.c 2006-05-30 13:57:24.716589268 +0800 @@ -120,6 +120,7 @@ enum { ACCEL_CLOSURES_CHANGED, SCREEN_CHANGED, CAN_ACTIVATE_ACCEL, + KEYNAV_FAILED, LAST_SIGNAL }; @@ -202,6 +203,8 @@ static gboolean gtk_widget_real_focus_o GdkEventFocus *event); static gboolean gtk_widget_real_focus (GtkWidget *widget, GtkDirectionType direction); +static gboolean gtk_widget_real_keynav_failed (GtkWidget *widget, + GtkDirectionType direction); static PangoContext* gtk_widget_peek_pango_context (GtkWidget *widget); static void gtk_widget_propagate_state (GtkWidget *widget, GtkStateData *data); @@ -363,6 +366,7 @@ gtk_widget_class_init (GtkWidgetClass *k klass->mnemonic_activate = gtk_widget_real_mnemonic_activate; klass->grab_focus = gtk_widget_real_grab_focus; klass->focus = gtk_widget_real_focus; + klass->keynav_failed = gtk_widget_real_keynav_failed; klass->event = NULL; klass->button_press_event = NULL; klass->button_release_event = NULL; @@ -1368,6 +1372,16 @@ gtk_widget_class_init (GtkWidgetClass *k _gtk_marshal_VOID__OBJECT, G_TYPE_NONE, 1, GDK_TYPE_SCREEN); + + widget_signals[KEYNAV_FAILED] = + g_signal_new (("keynav_failed"), + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GtkWidgetClass, keynav_failed), + _gtk_boolean_handled_accumulator, NULL, + _gtk_marshal_BOOLEAN__ENUM, + G_TYPE_BOOLEAN, 1, + GTK_TYPE_DIRECTION_TYPE); /** * GtkWidget::can-activate-accel: * @widget: the object which received the signal @@ -4044,6 +4058,34 @@ gtk_widget_real_focus (GtkWidget return FALSE; } +static gboolean +gtk_widget_real_keynav_failed (GtkWidget *widget, + GtkDirectionType direction) +{ + GtkSettings *settings = gtk_widget_get_settings (widget); + gboolean cursor_only_focus; + + g_object_get (settings, "gtk-cursor-only-focus", &cursor_only_focus, NULL); + + switch (direction) + { + case GTK_DIR_TAB_FORWARD: + case GTK_DIR_TAB_BACKWARD: + return FALSE; + + case GTK_DIR_UP: + case GTK_DIR_DOWN: + case GTK_DIR_LEFT: + case GTK_DIR_RIGHT: + if (cursor_only_focus) + return FALSE; + } + + gdk_beep (); + + return TRUE; +} + /** * gtk_widget_is_focus: * @widget: a #GtkWidget @@ -5500,6 +5542,20 @@ gtk_widget_child_focus (GtkWidget return return_val; } +gboolean +gtk_widget_keynav_failed (GtkWidget *widget, + GtkDirectionType direction) +{ + gboolean return_val; + + g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE); + + g_signal_emit (widget, widget_signals[KEYNAV_FAILED], 0, + direction, &return_val); + + return return_val; +} + /** * gtk_widget_set_uposition: * @widget: a #GtkWidget diff -r -u -p /data/zzz/gtk-2.6/gtk+-2.6.10/gtk/widget/gtkwidget.h gtk/widget/gtkwidget.h --- /data/zzz/gtk-2.6/gtk+-2.6.10/gtk/widget/gtkwidget.h 2006-05-30 13:57:49.736942642 +0800 +++ gtk/gtkwidget.h 2006-05-30 13:57:24.716589268 +0800 @@ -406,8 +406,9 @@ struct _GtkWidgetClass gboolean (*can_activate_accel) (GtkWidget *widget, guint signal_id); + gboolean (* keynav_failed) (GtkWidget *widget, + GtkDirectionType direction); /* Padding for future expansion */ - void (*_gtk_reserved2) (void); void (*_gtk_reserved3) (void); void (*_gtk_reserved4) (void); void (*_gtk_reserved5) (void); @@ -562,7 +563,8 @@ GdkWindow *gtk_widget_get_parent_window gboolean gtk_widget_child_focus (GtkWidget *widget, GtkDirectionType direction); - +gboolean gtk_widget_keynav_failed (GtkWidget *widget, + GtkDirectionType direction); void gtk_widget_set_size_request (GtkWidget *widget, gint width, gint height); Only in gtk/widget: gtkwidget.h.bak Only in gtk/widget: gtkwidget.lo