summaryrefslogtreecommitdiff
path: root/src/Fl_Table_Row.cxx
diff options
context:
space:
mode:
authorGreg Ercolano <erco@seriss.com>2011-11-13 02:46:10 +0000
committerGreg Ercolano <erco@seriss.com>2011-11-13 02:46:10 +0000
commitbaca25f9024b2b4872691673facbc4eb76681ad5 (patch)
treea93a84a0c5fc686efa1ecb6245fafa62336a11e9 /src/Fl_Table_Row.cxx
parent3086c07eec8d7b87e4504ef58b95e43f34a84051 (diff)
Fix for problem with posting 'popup menus' during user callback
causing change in row/col selection of Fl_Table_Row. As reported by David Lopez in fltk.general on 11/09/2011, Subject: Popup menu over Fl_Table. git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@9172 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src/Fl_Table_Row.cxx')
-rw-r--r--src/Fl_Table_Row.cxx49
1 files changed, 33 insertions, 16 deletions
diff --git a/src/Fl_Table_Row.cxx b/src/Fl_Table_Row.cxx
index c8b80efa5..fd0e98f7d 100644
--- a/src/Fl_Table_Row.cxx
+++ b/src/Fl_Table_Row.cxx
@@ -155,23 +155,40 @@ void Fl_Table_Row::rows(int val) {
while ( val < (int)_rowselect.size() ) { _rowselect.pop_back(); } // shrink
}
-// #include "eventnames.h" // debugging
-// #include <stdio.h>
+//#define DEBUG 1
+#ifdef DEBUG
+#include <FL/names.h>
+#define PRINTEVENT \
+ fprintf(stderr,"TableRow %s: ** Event: %s --\n", (label()?label():"none"), fl_eventnames[event]);
+#else
+#define PRINTEVENT
+#endif
// Handle events
int Fl_Table_Row::handle(int event) {
-
- // fprintf(stderr, "** EVENT: %s: EVENT XY=%d,%d\n",
- // eventnames[event], Fl::event_x(), Fl::event_y()); // debugging
+ PRINTEVENT;
+
+ // Make snapshots of realtime event states *before* we service user's cb,
+ // which may do things like post popup menus that return with unexpected button states.
+ int _event_button = Fl::event_button();
+ //int _event_clicks = Fl::event_clicks(); // uncomment if needed
+ int _event_x = Fl::event_x();
+ int _event_y = Fl::event_y();
+ //int _event_key = Fl::event_key(); // uncomment if needed
+ int _event_state = Fl::event_state();
+ //Fl_Widget *_focus = Fl::focus(); // uncomment if needed
// Let base class handle event
+ // Note: base class may invoke user callbacks that post menus,
+ // so from here on use event state snapshots (above).
+ //
int ret = Fl_Table::handle(event);
// The following code disables cell selection.. why was it added? -erco 05/18/03
// if ( ret ) { _last_y = Fl::event_y(); return(1); } // base class 'handled' it (eg. column resize)
- int shiftstate = (Fl::event_state() & FL_CTRL) ? FL_CTRL :
- (Fl::event_state() & FL_SHIFT) ? FL_SHIFT : 0;
+ int shiftstate = (_event_state & FL_CTRL) ? FL_CTRL :
+ (_event_state & FL_SHIFT) ? FL_SHIFT : 0;
// Which row/column are we over?
int R, C; // row/column being worked on
@@ -179,9 +196,9 @@ int Fl_Table_Row::handle(int event) {
TableContext context = cursor2rowcol(R, C, resizeflag);
switch ( event ) {
case FL_PUSH:
- if ( Fl::event_button() == 1 ) {
- _last_push_x = Fl::event_x(); // save regardless of context
- _last_push_y = Fl::event_y(); // " "
+ if ( _event_button == 1 ) {
+ _last_push_x = _event_x; // save regardless of context
+ _last_push_y = _event_y; // " "
// Handle selection in table.
// Select cell under cursor, and enable drag selection mode.
@@ -230,7 +247,7 @@ int Fl_Table_Row::handle(int event) {
if ( offtop > 0 && row_position() > 0 ) {
// Only scroll in upward direction
- int diff = _last_y - Fl::event_y();
+ int diff = _last_y - _event_y;
if ( diff < 1 ) {
ret = 1;
break;
@@ -241,7 +258,7 @@ int Fl_Table_Row::handle(int event) {
}
else if ( offbot > 0 && botrow < rows() ) {
// Only scroll in downward direction
- int diff = Fl::event_y() - _last_y;
+ int diff = _event_y - _last_y;
if ( diff < 1 ) {
ret = 1;
break;
@@ -281,7 +298,7 @@ int Fl_Table_Row::handle(int event) {
}
case FL_RELEASE:
- if ( Fl::event_button() == 1 ) {
+ if ( _event_button == 1 ) {
_dragging_select = 0;
ret = 1; // release handled
// Clicked off edges of data table?
@@ -290,8 +307,8 @@ int Fl_Table_Row::handle(int event) {
int databot = tiy + table_h,
dataright = tix + table_w;
if (
- ( _last_push_x > dataright && Fl::event_x() > dataright ) ||
- ( _last_push_y > databot && Fl::event_y() > databot )
+ ( _last_push_x > dataright && _event_x > dataright ) ||
+ ( _last_push_y > databot && _event_y > databot )
) {
select_all_rows(0); // clear previous selections
}
@@ -301,7 +318,7 @@ int Fl_Table_Row::handle(int event) {
default:
break;
}
- _last_y = Fl::event_y();
+ _last_y = _event_y;
return(ret);
}