FLTK logo

STR #1263

FLTK matrix user chat room
(using Element browser app)   FLTK gitter user chat room   GitHub FLTK Project   FLTK News RSS Feed  
  FLTK Apps      FLTK Library      Forums      Links     Login 
 Home  |  Articles & FAQs  |  Bugs & Features  |  Documentation  |  Download  |  Screenshots  ]
 

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:

Receive EMails Don't Receive EMails

Trouble Report Files:

Post File ]

No files


Trouble Report Comments:

Post Text ]
Name/Time/Date 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 ]

 
 

Comments are owned by the poster. All other content is copyright 1998-2024 by Bill Spitzak and others. This project is hosted by The FLTK Team. Please report site problems to 'erco@seriss.com'.