summaryrefslogtreecommitdiff
path: root/dw/fltkviewbase.cc
diff options
context:
space:
mode:
authorcorvid <corvid@lavabit.com>2012-12-23 20:05:01 +0000
committercorvid <corvid@lavabit.com>2012-12-23 20:05:01 +0000
commit205403d0e8a053abf6b3c9786a62c28dfc9d8bc3 (patch)
tree527a7a018395d831ca721fe6dfecc21421f856a6 /dw/fltkviewbase.cc
parent203d29dd1c472cf4ca1025c288db7a60144833fd (diff)
when tabbing among view's children, scroll to them
Diffstat (limited to 'dw/fltkviewbase.cc')
-rw-r--r--dw/fltkviewbase.cc32
1 files changed, 28 insertions, 4 deletions
diff --git a/dw/fltkviewbase.cc b/dw/fltkviewbase.cc
index feab0ad7..02cccb2d 100644
--- a/dw/fltkviewbase.cc
+++ b/dw/fltkviewbase.cc
@@ -296,10 +296,34 @@ int FltkViewBase::handle (int event)
focused_child = fl_oldfocus;
return 0;
case FL_KEYBOARD:
- if (Fl::event_key() == FL_Tab && this == Fl::focus()) {
- for (int i = 0; i < children(); i++) {
- if (child(i)->take_focus())
- return 1;
+ if (Fl::event_key() == FL_Tab) {
+ 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;
+ }
+ } 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;
+ }
+ if (ret) {
+ if (i < children()) {
+ Fl_Widget *c = child(i);
+
+ theLayout->scrollTo(core::HPOS_INTO_VIEW, core::VPOS_INTO_VIEW,
+ translateViewXToCanvasX(c->x()),
+ translateViewYToCanvasY(c->y()),
+ c->w(), c->h());
+ }
+ return 1;
}
}
break;