diff options
author | Michael Natterer <mitch@imendio.com> | 2006-11-16 12:56:30 +0000 |
---|---|---|
committer | Michael Natterer <mitch@src.gnome.org> | 2006-11-16 12:56:30 +0000 |
commit | 7f374a74bae63c9c1011c2a5a9c99de4012e7c61 (patch) | |
tree | 172bd0c74b8bdc35ff1d8dc5058861f9dd500d41 /gtk/gtklabel.c | |
parent | af6b361d6b481a21f69a3a1f7305c11425a500e2 (diff) | |
download | gtk+-7f374a74bae63c9c1011c2a5a9c99de4012e7c61.tar.gz |
Add new infrastructure for notifications of failed keyboard navigation and
2006-11-16 Michael Natterer <mitch@imendio.com>
Add new infrastructure for notifications of failed keyboard
navigation and navigation with restricted set of keys.
The patch handles configurable beeping, navigating the GUI with
cursor keys only (as in phone environments), and configurable
wrap-around. Fixes bugs #322640, #70986, #318827, #334726, #334742
and #309291.
* gtk/gtksettings.c: added properties gtk-keynav-cursor-only,
gtk-keynav-wrap-around and gtk-error-bell.
* gtk/gtkwidget.[ch]: added new signal "keynav-failed" and public
API to emit it. Added New function gtk_widget_error_bell() which
looks at the gtk-error-bell setting and calls gdk_window_beep()
accordingly.
* gtk/gtk.symbols: add the new widget symbols.
* gtk/gtkcellrendereraccel.c
* gtk/gtkimcontextsimple.c
* gtk/gtkmenu.c
* gtk/gtknotebook.c: use gtk_widget_error_bell() or look at the
gtk-error-bell setting instead of calling gdk_display_beep()
unconditionally.
* gtk/gtkcombobox.c
* gtk/gtkentry.c
* gtk/gtkiconview.c
* gtk/gtklabel.c
* gtk/gtkmenushell.c
* gtk/gtkspinbutton.c
* gtk/gtktextview.c
* gtk/gtktreeview.c: call gtk_widget_error_bell() on failed keynav.
* gtk/gtkentry.c
* gtk/gtklabel.c
* gtk/gtkrange.c
* gtk/gtktextview.c: consult gtk_widget_keynav_failed() on failed
cursor navigation and leave the widget if it returns FALSE.
* gtk/gtkmenushell.c
* gtk/gtknotebook.c: only wrap around if gtk-keynav-wrap-around
is TRUE.
* gtk/gtkradiobutton.c: ask gtk_widget_keynav_failed() to decide
whether to to wrap-around, and don't select active items on cursor
navigation if gtk-keynav-cursor-only is TRUE. Should look at
gtk-keynav-wrap-around too, will look into that.
Diffstat (limited to 'gtk/gtklabel.c')
-rw-r--r-- | gtk/gtklabel.c | 35 |
1 files changed, 30 insertions, 5 deletions
diff --git a/gtk/gtklabel.c b/gtk/gtklabel.c index 409bc18e53..cfe21cef71 100644 --- a/gtk/gtklabel.c +++ b/gtk/gtklabel.c @@ -891,8 +891,8 @@ gtk_label_mnemonic_activate (GtkWidget *widget, /* barf if there was nothing to activate */ g_warning ("Couldn't find a target for a mnemonic activation."); - gdk_display_beep (gtk_widget_get_display (widget)); - + gtk_widget_error_bell (widget); + return FALSE; } @@ -3871,12 +3871,13 @@ gtk_label_move_cursor (GtkLabel *label, gint count, gboolean extend_selection) { + gint old_pos; gint new_pos; if (label->select_info == NULL) return; - - new_pos = label->select_info->selection_end; + + old_pos = new_pos = label->select_info->selection_end; if (label->select_info->selection_end != label->select_info->selection_anchor && !extend_selection) @@ -3901,7 +3902,6 @@ gtk_label_move_cursor (GtkLabel *label, new_pos = end_is_left ? label->select_info->selection_end : label->select_info->selection_anchor; else new_pos = !end_is_left ? label->select_info->selection_end : label->select_info->selection_anchor; - break; } case GTK_MOVEMENT_LOGICAL_POSITIONS: @@ -3933,6 +3933,27 @@ gtk_label_move_cursor (GtkLabel *label, break; case GTK_MOVEMENT_VISUAL_POSITIONS: new_pos = gtk_label_move_visually (label, new_pos, count); + if (new_pos == old_pos) + { + if (!extend_selection) + { + if (!gtk_widget_keynav_failed (GTK_WIDGET (label), + count > 0 ? + GTK_DIR_RIGHT : GTK_DIR_LEFT)) + { + GtkWidget *toplevel = gtk_widget_get_toplevel (GTK_WIDGET (label)); + + if (toplevel) + gtk_widget_child_focus (toplevel, + count > 0 ? + GTK_DIR_RIGHT : GTK_DIR_LEFT); + } + } + else + { + gtk_widget_error_bell (GTK_WIDGET (label)); + } + } break; case GTK_MOVEMENT_WORDS: while (count > 0) @@ -3945,12 +3966,16 @@ gtk_label_move_cursor (GtkLabel *label, new_pos = gtk_label_move_backward_word (label, new_pos); count++; } + if (new_pos == old_pos) + gtk_widget_error_bell (GTK_WIDGET (label)); break; case GTK_MOVEMENT_DISPLAY_LINE_ENDS: case GTK_MOVEMENT_PARAGRAPH_ENDS: case GTK_MOVEMENT_BUFFER_ENDS: /* FIXME: Can do better here */ new_pos = count < 0 ? 0 : strlen (label->text); + if (new_pos == old_pos) + gtk_widget_error_bell (GTK_WIDGET (label)); break; case GTK_MOVEMENT_DISPLAY_LINES: case GTK_MOVEMENT_PARAGRAPHS: |