aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcorvid <corvid@lavabit.com>2012-12-24 02:08:05 +0000
committercorvid <corvid@lavabit.com>2012-12-24 02:08:05 +0000
commit33e67fba5f78a33e0798a675028cfa7510f5d735 (patch)
tree2e9a90e26788726565cadcf47d24aa4b8964bf73
parentb6d58d26af799be0d74f5c0456dba9753c7013f1 (diff)
when tabbing through widgets, add view to the loop
I see that firefox includes Location as well, but that would likely be tricky in our case.
-rw-r--r--dw/fltkviewbase.cc40
1 files changed, 28 insertions, 12 deletions
diff --git a/dw/fltkviewbase.cc b/dw/fltkviewbase.cc
index 3063cf73..93498ce3 100644
--- a/dw/fltkviewbase.cc
+++ b/dw/fltkviewbase.cc
@@ -301,22 +301,38 @@ int FltkViewBase::handle (int event)
int i, ret = 0;
if (this == Fl::focus()) {
- // if we have focus, give it to a child
- for (i = 0; i < children(); i++)
- if (child(i)->take_focus()) {
- ret = 1;
- break;
+ // if we have focus, give it to a child. Go forward typically,
+ // or backward with Shift pressed.
+ if (!(Fl::event_state() & FL_SHIFT)) {
+ for (i = 0; i < children(); i++) {
+ if (child(i)->take_focus()) {
+ ret = 1;
+ break;
+ }
}
+ } else {
+ for (i = children() - 1; i >= 0; i--) {
+ if (child(i)->take_focus()) {
+ ret = 1;
+ break;
+ }
+ }
+ }
} else {
- // tabbing between children; which got focus?
- if (!(ret = Fl_Group::handle (event)))
- return 0;
- for (i = 0; i < children(); i++)
- if (child(i) == Fl::focus())
- break;
+ // tabbing between children
+ if (!(ret = Fl_Group::handle (event))) {
+ // group didn't have any more children to focus.
+ Fl::focus(this);
+ return 1;
+ } else {
+ // which one did it focus?
+ for (i = 0; i < children(); i++)
+ if (child(i) == Fl::focus())
+ break;
+ }
}
if (ret) {
- if (i < children()) {
+ if (i >= 0 && i < children()) {
Fl_Widget *c = child(i);
theLayout->scrollTo(core::HPOS_INTO_VIEW, core::VPOS_INTO_VIEW,