summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael R Sweet <michael.r.sweet@gmail.com>2001-07-05 00:20:41 +0000
committerMichael R Sweet <michael.r.sweet@gmail.com>2001-07-05 00:20:41 +0000
commit3f5ad43d645914cf47efd96753e4cae78b5f22d2 (patch)
tree1af6f17d0aabaf0ac1641fa828b4f7cdf06efec1 /src
parent61b94f7f0ba9c0569e036abcdb5d4216a50db8a8 (diff)
Fixed crash if you shift+click on a multibrowser below the last item
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.0@1472 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src')
-rw-r--r--src/Fl_Browser_.cxx47
1 files changed, 24 insertions, 23 deletions
diff --git a/src/Fl_Browser_.cxx b/src/Fl_Browser_.cxx
index 903479b23..736d3b345 100644
--- a/src/Fl_Browser_.cxx
+++ b/src/Fl_Browser_.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Browser_.cxx,v 1.10.2.15 2001/01/22 15:13:39 easysw Exp $"
+// "$Id: Fl_Browser_.cxx,v 1.10.2.16 2001/07/05 00:20:41 uid28863 Exp $"
//
// Base Browser widget class for the Fast Light Tool Kit (FLTK).
//
@@ -563,35 +563,36 @@ int Fl_Browser_::handle(int event) {
void* l = find_item(my);
whichway = 1;
if (Fl::event_state(FL_CTRL)) { // toggle selection:
+ TOGGLE:
if (l) {
whichway = !item_selected(l);
change = select(l, whichway, when() & FL_WHEN_CHANGED);
}
} else if (Fl::event_state(FL_SHIFT)) { // extend selection:
- change = 0;
- if (selection_ && l != selection_) {
- void *m = l;
- int down = 0;
- whichway = item_selected(selection_);
- for (m = selection_; m; m = item_next(m)) {
- if (m == l) down = 1;
- }
- void *n;
- if (down) {
- m = selection_;
- n = l;
- } else {
- m = l;
- n = selection_;
- }
- while (m != n) {
+ if (l == selection_) goto TOGGLE;
+ // state of previous selection determines new value:
+ whichway = l ? !item_selected(l) : 1;
+ // see which of the new item or previous selection is earlier,
+ // by searching from the previous forward for this one:
+ int down;
+ if (!l) down = 1;
+ else {for (void* m = selection_; ; m = item_next(m)) {
+ if (m == l) {down = 1; break;}
+ if (!m) {down = 0; break;}
+ }}
+ if (down) {
+ for (void* m = selection_; m != l; m = item_next(m))
+ select(m, whichway, when() & FL_WHEN_CHANGED);
+ } else {
+ void* e = selection_;
+ for (void* m = item_next(l); m; m = item_next(m)) {
select(m, whichway, when() & FL_WHEN_CHANGED);
- m = item_next(m);
+ if (m == e) break;
}
- select(n, whichway, when() & FL_WHEN_CHANGED);
- select(l, whichway, when() & FL_WHEN_CHANGED);
- change = 1;
}
+ // do the clicked item last so the select box is around it:
+ if (l) select(l, whichway, when() & FL_WHEN_CHANGED);
+ change = 1;
} else { // select only this item
change = select_only(l, when() & FL_WHEN_CHANGED);
}
@@ -706,5 +707,5 @@ void Fl_Browser_::item_select(void*, int) {}
int Fl_Browser_::item_selected(void* l) const {return l==selection_;}
//
-// End of "$Id: Fl_Browser_.cxx,v 1.10.2.15 2001/01/22 15:13:39 easysw Exp $".
+// End of "$Id: Fl_Browser_.cxx,v 1.10.2.16 2001/07/05 00:20:41 uid28863 Exp $".
//