From 33e67fba5f78a33e0798a675028cfa7510f5d735 Mon Sep 17 00:00:00 2001 From: corvid Date: Mon, 24 Dec 2012 02:08:05 +0000 Subject: 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. --- dw/fltkviewbase.cc | 40 ++++++++++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 12 deletions(-) (limited to 'dw/fltkviewbase.cc') 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, -- cgit v1.2.3