JanE wrote:
> greetings,
> 
> i have just found that the Fl_Button handle() enables 
> dragging on buttons. if when() matches FL_WHEN_CHANGED it 
> even triggers the callback, so that when you drag on it, it 
> constantly switches on and off.
> 
> why is this behaviour wanted? enlighten me please? :)

I'm not sure, but I think that a part of the problem is that 
Fl_Button::handle() 
handles all kinds of buttons, including radio buttons, and this might be part 
of 
the problem. The code is at least difficult to understand, and IIRC there is no 
complete documentation of what is intended and what not.

That said, there may be unintended behavior as well.

> anyway, this behaviour is annyoing in the following 
> example:
> a Mute button in a mixer. it should trigger the callback 
> instantly, otherwise you cant precisely mute (think drum 
> track muting), so we set it to call the callback on 
> FL_WHEN_CHANGED.  now, if you accidently drag slightly 
> instead of just pushing the button (may happen right?), it 
> could be that the callback is triggered twice and, oh no, 
> the drumtrack moves on!

I can't reproduce this. IIRC you're using 1.1.9? Is this behavior different on 
different platforms (what are you using?).

I tried it with test/button.cxx and the following patch:

$ svn diff
Index: test/button.cxx
===================================================================
--- test/button.cxx     (revision 6805)
+++ test/button.cxx     (working copy)
@@ -31,8 +31,10 @@
  #include <FL/Fl_Window.H>
  #include <FL/Fl_Button.H>

-void beepcb(Fl_Widget *, void *) {
+void beepcb(Fl_Widget *w, void *) {
    printf("\007"); fflush(stdout);
+  Fl_Button *b = (Fl_Button*)w;
+  //b->value(b->value());
  }

  void exitcb(Fl_Widget *, void *) {
@@ -52,6 +54,7 @@
    Fl_Window *window = new Fl_Window(320,65);
    Fl_Button *b1 = new Fl_Button(20, 20, 80, 25, "&Beep");
    b1->callback(beepcb,0);
+  b1->when(FL_WHEN_CHANGED);
    /*Fl_Button *b2 =*/ new Fl_Button(120,20, 80, 25, "&no op");
    Fl_Button *b3 = new Fl_Button(220,20, 80, 25, "E&xit");
    b3->callback(exitcb,0);

This is fltk 1.3 code, but I also tried it with 1.1 (and even 2.0 - there's 
also 
an open STR about different behavior with 2.0, but I don't remember the number).

The significant part in this patch is "b1->when(FL_WHEN_CHANGED);". I can only 
see that the button triggers the callback while dragging when the mouse pointer 
leaves the button area (and when it enters again). While the latter is (IMHO) 
somewhat unexpected behavior, this is not what you described.

It's a completely different story, if you uncomment the statement in beep_cb: 
"b->value(b->value());". Do you by any chance use value(int) inside your 
callback?

To find out what's happening, can you produce a small example like this, maybe 
starting with test/button.cxx, that reproduces your described behavior?

I'm interested to find bugs, if there are any.

> i fixed this by overwriting the handler in a derived class, 
> but like to discuss this anyway.

Yep, this the way to go if you need "special" behavior. FLTK can only give you 
some standard behavior with its callbacks. You can tune it by setting when(), 
and if you need more fine tuning, you can even access any event related info 
(like mouse cursor position while dragging [HINT]) in your callback - but if 
this is not enough, subclassing is the way to go.

Albrecht
_______________________________________________
fltk mailing list
fltk@easysw.com
http://lists.easysw.com/mailman/listinfo/fltk

Reply via email to