Comparing when() Behavior of Fl_Radio and Fl_Browser (Hold+Multi)

Widget Mouse Click Behavior Keyboard Behavior
WHEN_NEVER Fl_Radio_Button no callback ever no callback ever
Fl_Hold_Browser no callback ever no callback ever
Fl_Multi_Browser no callback ever no callback ever
 
WHEN_RELEASE Fl_Radio_Button change: callback on RELEASE, no change: no callback change: callback on PUSH changed()=true, no change: callback on PUSH changed()=true
Fl_Hold_Browser change: callback on RELEASE, no change: no callback
change: callback on PUSH changed()=true, no change: no callback
Fl_Multi_Browser change: callback on RELEASE, no change: no callback
change: callback on PUSH changed()=true, no change: no callback [2]
 
WHEN_CHANGED Fl_Radio_Button change: callback on PUSH, no change: no callback change: callback on PUSH, no change: no callback
Fl_Hold_Browser change: callback on PUSH, no change: no callback
change: callback on PUSH changed()=true, no change: no callback
Fl_Multi_Browser change: callback on PUSH, no change: no callback
change: callback on PUSH, no change: no callback[2]
 
WHEN_NOT_CHANGED Fl_Radio_Button change: no callback, no change: callback on RELEASE change: no callback, no change: no callback
Fl_Hold_Browser change: no callback, no change: callback on RELEASE change: callback on PUSH changed()=true, no change: no callback [4]
Fl_Multi_Browser change: no callback, no change: callback on RELEASE change: callback on PUSH changed()=true, no change: no callback [4]
 
WHEN_CHANGED +
WHEN_NOT_CHANGED
Fl_Radio_Button change: callback on PUSH, no change: callback on RELEASE change: callback on PUSH, no change: no callback
Fl_Hold_Browser change: callback on PUSH, no change: callback on RELEASE change: callback on PUSH, no change: no callback
Fl_Multi_Browser change: callback on PUSH, no change: callback on RELEASE change: callback on PUSH of Spacebar always, Enter only if changed. [2]
 
WHEN_RELEASE +
WHEN_CHANGED
Fl_Radio_Button change: callback on PUSH and RELEASE, no change: no callback change: two callbacks for same widet on PUSH changed()=false, no change: callback on PUSH with changed()=true.
Fl_Hold_Browser change: callback on PUSH and RELEASE[1], no change: no callback change: callback on PUSH of Up/Dn Arrows, no change: no callback
Fl_Multi_Browser change: callback on PUSH and RELEASE, no change: no callback change: callback on PUSH of Spacebar always, Enter only if changed, no change: no callback [2]
 
WHEN_RELEASE +
WHEN_NOT_CHANGED
Fl_Radio_Button change: callback on RELEASE changed()=false, no change: callback on RELEASE changed()=false change: callback on PUSH with changed()=false, no change: callback on PUSH changed()=false
Fl_Hold_Browser change: callback on RELEASE changed()=true, no change: callback on RELEASE changed()=false change: callback on PUSH changed()=true, no change: no callback
Fl_Multi_Browser change: callback on RELEASE changed()=true, no change: callback on RELEASE changed()=false [3] change: callback on PUSH changed()=true, no change: no callback
 
WHEN_RELEASE +
WHEN_CHANGED +
WHEN_NOT_CHANGED
Fl_Radio_Button change: callback on PUSH changed()=true and RELEASE changed()=false, no change: callback on RELEASE changed()=0 change: callback on PUSH with changed()=false, no change: callback on PUSH with changed()=true
Fl_Hold_Browser change: callback on PUSH and RELEASE changed()=true, no change: callback on RELEASE changed()=false change: callback on PUSH changed()=true, no change: no callback
Fl_Multi_Browser change: callback on PUSH and RELEASE changed()=true, no change: callback on RELEASE changed()=false [5] change: callback on PUSH with changed()=true, no change: no callback


RED TEXT is behavior I think is a bug and should be fixed.
BLUE TEXT is behavior I think might be a bug and should maybe be changed.
Hover over the red or blue text: tooltips say what I think the behavior should be.

Notes on the above table:
  1. Both callbacks were for the same widget.
    Instead: first callback should be for item turned off, second should be for item turned on.
  2. If several items change state during Enter, each invokes callback.
  3. Always only one callback, even when multiple items change state.
    This is bad in cases where a 'callback on change' is expected.
  4. No callback occurs when hitting top/bottom of browser with Up or Dn arrows
    This is bad in cases where a 'callback on no change' is expected.
  5. No callback on Enter key if no change is made
    Instead: *should* callback on Enter if no change is made



Special Behavior For Browser Blank Area

Widget Blank Area Mouse Click Behavior
 
WHEN_NEVER Fl_Hold_Browser change: callback on RELEASE, no change: no callback
Fl_Multi_Browser change: callback on RELEASE, no change: no callback
 
WHEN_RELEASE Fl_Hold_Browser TBD
Fl_Multi_Browser TBD
 
WHEN_CHANGED Fl_Hold_Browser change: callback on PUSH with value()=0 text()=NULL changed()=true, no change: no callback
Fl_Multi_Browser change: callback on PUSH, no change: no callback [B]
 
WHEN_NOT_CHANGED Fl_Hold_Browser change: no callback, no change: callback on RELEASE with text()==NULL
Fl_Multi_Browser change: no callback, no change: callback on RELEASE with text()=last changed item
 
WHEN_CHANGED +
WHEN_NOT_CHANGED
Fl_Hold_Browser change: callback on PUSH and RELEASE with text()==NULL
no change: callback on RELEASE with text()==NULL if no change
Fl_Multi_Browser change: callback on PUSH with text()==last changed item,
no change: callback on RELEASE with text()==last changed item
 
WHEN_RELEASE +
WHEN_CHANGED
Fl_Hold_Browser TBD
Fl_Multi_Browser TBD
 
WHEN_RELEASE +
WHEN_NOT_CHANGED
Fl_Hold_Browser TBD
Fl_Multi_Browser TBD
 
WHEN_RELEASE +
WHEN_CHANGED +
WHEN_NOT_CHANGED
Fl_Hold_Browser TBD
Fl_Multi_Browser TBD
 


Notes on the above table:
  1. One callback for item changed, one for text()==NULL.
    Instead: Shouldn't invoke callback for NULL -- blank area didn't "change"!!!
  2. One callback with text()==last item changed.
    Should invoke callback for EACH item changed, not just one.
    text() should be the item that changed, not the last item.
    Example: Highlight Aaa/Bbb/Ccc then click on empty area, get one callback for 'Ddd' (!!!) with changed()==true