Within the callback function, you need to cast the pointer that arrives to the correct type, then use its information, as shown below.
// Sending complex data to a callback function
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Button.H>
#include <FL/Fl_Value_Output.H>
// Global pointers for the GUI objects
Fl_Window* mywindow;
Fl_Button* spiderbutton;
Fl_Button* dogbutton;
Fl_Value_Output* legbox;
Fl_Value_Output* breedbox;
// Tiny class (really just a struct) to hold info for the callback
// You should use meaningful names, but there can be as much information
// as you need
class Kitchensink {
public:
int x;
int y;
Kitchensink(int xin, int yin): x(xin), y(yin) {};
};
// Callback function
void mybutton_cb(Fl_Widget* w, void* data) {
int legs = ((Kitchensink*)data)->x;
int breeds = ((Kitchensink*)data)->y;
legbox->value(double(legs));
breedbox->value(double(breeds));
}
// Execution starts here
int main() {
mywindow = new Fl_Window(300,180,"FLTK skeleton program");
// Two buttons, sharing one callback
spiderbutton = new Fl_Button(50, 50, 50, 30, "Spider");
dogbutton = new Fl_Button(200, 50, 50, 30, "Dog");
// construct data objects and connect up the callback
spiderbutton->callback(mybutton_cb, new Kitchensink(8, 13));
dogbutton->callback(mybutton_cb, new Kitchensink(4, 78));
// Output boxes
legbox = new Fl_Value_Output(60, 100, 200, 30, "Legs");
breedbox = new Fl_Value_Output(60, 130, 200, 30, "Breeds");
// Make the window visible and start processing events
mywindow->end();
mywindow->show();
return Fl::run();
}