diff options
author | corvid <corvid@lavabit.com> | 2012-12-24 02:08:05 +0000 |
---|---|---|
committer | corvid <corvid@lavabit.com> | 2012-12-24 02:08:05 +0000 |
commit | 33e67fba5f78a33e0798a675028cfa7510f5d735 (patch) | |
tree | 2e9a90e26788726565cadcf47d24aa4b8964bf73 /dw/fltkviewbase.cc | |
parent | b6d58d26af799be0d74f5c0456dba9753c7013f1 (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.
Diffstat (limited to 'dw/fltkviewbase.cc')
-rw-r--r-- | dw/fltkviewbase.cc | 40 |
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, |