diff options
Diffstat (limited to 'src/Fl_Table_Row.cxx')
| -rw-r--r-- | src/Fl_Table_Row.cxx | 49 |
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); } |
