| [ Return to Bugs & Features | Roadmap 2.0 | Post Text | Post File | SVN ⇄ GIT ]
STR #1263
Application: | FLTK Library |
Status: | 5 - New |
Priority: | 1 - Request for Enhancement, e.g. asking for a feature |
Scope: | 3 - Applies to all machines and operating systems |
Subsystem: | Unassigned |
Summary: | Callback Update improvements |
Version: | 2.0-feature |
Created By: | fabien |
Assigned To: | Unassigned |
Fix Version: | Unassigned |
Update Notification: | |
Trouble Report Files:
[ Post File ]No files
Trouble Report Comments:
[ Post Text ]
|
#1 | fabien 01:21 May 05, 2006 |
| In discussing what to do for safe widget deletion from callback functions, we have also talked about what to do about changed() - in FLTK 1.1.x we clear changed() after a callback, which requires access to the (potentially deleted) widget.
Retained proposals: -------------------
In order to avoid that sequence, and to preserve some measure of API compatibility with 1.x, I propose the following changes to the fltk::Widget class and related types and constants:
1. Change the standard callback function prototype to:
typedef void (Callback)(Widget *widget, void *user_data, unsigned changed);
The "changed" parameter would be a bitmask for the current changes to the widget.
2. Change the "changed" flag from a simple boolean flag to a bitmask using the WHEN_* constants.
3. Extend the WHEN_ constants to include user-defined and widget-specific conditions, e.g.:
enum { WHEN_NEVER = 0, WHEN_CHANGED = 1, WHEN_NOT_CHANGED = 2, WHEN_RELEASE = 4, WHEN_RELEASE_ALWAYS = 6, WHEN_ENTER_KEY = 8, WHEN_ENTER_KEY_ALWAYS = 10, WHEN_ENTER_KEY_CHANGED = 11, WHEN_DRAGGED = 16, // ... other conditions ... WHEN_USER1 = 256, WHEN_USER2 = 512, WHEN_USER3 = 1024, WHEN_USER4 = 2048, WHEN_ALWAYS = ~0 }
4. Change the implementation of do_callback() to accept a changed value and OR it with the widget's current value:
void do_callback(unsigned changed = WHEN_CHANGED) { changed_ |= changed; if (callback_ && (when() & changed)) { (*callback_)(this, user_data_, changed); } }
5. Change the implementation of changed(), set_changed(), and clear_changed() as follows:
long changed_; // New field to hold changed() value
long changed() const { return changed_; } void set_changed(long c = WHEN_CHANGED) { changed_ |= c; } void clear_changed(long c = WHEN_ALWAYS) { changed_ &= ~c; }
6. Document that the callback/program is responsible for clearing the changed() value, and that changed() will contain the bitwise OR of all changes that have occurred with the widget. | |
[ Return to Bugs & Features | Post Text | Post File ]
|
| |